mirror of
https://github.com/DapperLib/Dapper.git
synced 2026-10-24 17:50:04 +08:00
* initial net5.0 tweaks; also fix current IDE warnings * lib updates and fixes * more cleanup * fix snafu * skip locals init * disable xunit shadow copy in tests * test records * explore scenario that currently works re #1571
100 lines
4.1 KiB
C#
100 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
namespace Dapper
|
|
{
|
|
public static partial class SqlMapper
|
|
{
|
|
private sealed partial class DapperRow : System.Dynamic.IDynamicMetaObjectProvider
|
|
{
|
|
System.Dynamic.DynamicMetaObject System.Dynamic.IDynamicMetaObjectProvider.GetMetaObject(
|
|
System.Linq.Expressions.Expression parameter)
|
|
{
|
|
return new DapperRowMetaObject(parameter, System.Dynamic.BindingRestrictions.Empty, this);
|
|
}
|
|
}
|
|
|
|
private sealed class DapperRowMetaObject : System.Dynamic.DynamicMetaObject
|
|
{
|
|
private static readonly MethodInfo getValueMethod = typeof(IDictionary<string, object>).GetProperty("Item").GetGetMethod();
|
|
private 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)
|
|
{
|
|
}
|
|
|
|
private 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;
|
|
}
|
|
|
|
public override IEnumerable<string> GetDynamicMemberNames()
|
|
{
|
|
if(HasValue && Value is IDictionary<string, object> lookup) return lookup.Keys;
|
|
return Array.Empty<string>();
|
|
}
|
|
}
|
|
}
|
|
}
|