You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
3.4 KiB
84 lines
3.4 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
namespace Dapper
|
|
{
|
|
partial class SqlMapper
|
|
{
|
|
sealed class DapperRowMetaObject : System.Dynamic.DynamicMetaObject
|
|
{
|
|
static readonly MethodInfo getValueMethod = typeof(IDictionary<string, object>).GetProperty("Item").GetGetMethod();
|
|
static readonly MethodInfo setValueMethod = typeof(DapperRow).GetMethod("SetValue", new Type[] { typeof(string), typeof(object) });
|
|
|
|
public DapperRowMetaObject(
|
|
System.Linq.Expressions.Expression expression,
|
|
System.Dynamic.BindingRestrictions restrictions
|
|
)
|
|
: base(expression, restrictions)
|
|
{
|
|
}
|
|
|
|
public DapperRowMetaObject(
|
|
System.Linq.Expressions.Expression expression,
|
|
System.Dynamic.BindingRestrictions restrictions,
|
|
object value
|
|
)
|
|
: base(expression, restrictions, value)
|
|
{
|
|
}
|
|
|
|
System.Dynamic.DynamicMetaObject CallMethod(
|
|
MethodInfo method,
|
|
System.Linq.Expressions.Expression[] parameters
|
|
)
|
|
{
|
|
var callMethod = new System.Dynamic.DynamicMetaObject(
|
|
System.Linq.Expressions.Expression.Call(
|
|
System.Linq.Expressions.Expression.Convert(Expression, LimitType),
|
|
method,
|
|
parameters),
|
|
System.Dynamic.BindingRestrictions.GetTypeRestriction(Expression, LimitType)
|
|
);
|
|
return callMethod;
|
|
}
|
|
|
|
public override System.Dynamic.DynamicMetaObject BindGetMember(System.Dynamic.GetMemberBinder binder)
|
|
{
|
|
var parameters = new System.Linq.Expressions.Expression[]
|
|
{
|
|
System.Linq.Expressions.Expression.Constant(binder.Name)
|
|
};
|
|
|
|
var callMethod = CallMethod(getValueMethod, parameters);
|
|
|
|
return callMethod;
|
|
}
|
|
|
|
// Needed for Visual basic dynamic support
|
|
public override System.Dynamic.DynamicMetaObject BindInvokeMember(System.Dynamic.InvokeMemberBinder binder, System.Dynamic.DynamicMetaObject[] args)
|
|
{
|
|
var parameters = new System.Linq.Expressions.Expression[]
|
|
{
|
|
System.Linq.Expressions.Expression.Constant(binder.Name)
|
|
};
|
|
|
|
var callMethod = CallMethod(getValueMethod, parameters);
|
|
|
|
return callMethod;
|
|
}
|
|
|
|
public override System.Dynamic.DynamicMetaObject BindSetMember(System.Dynamic.SetMemberBinder binder, System.Dynamic.DynamicMetaObject value)
|
|
{
|
|
var parameters = new System.Linq.Expressions.Expression[]
|
|
{
|
|
System.Linq.Expressions.Expression.Constant(binder.Name),
|
|
value.Expression,
|
|
};
|
|
|
|
var callMethod = CallMethod(setValueMethod, parameters);
|
|
|
|
return callMethod;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|