我有很多子类,从IDbTypeHandler<T>
继承而来,
我想知道如何将"SetValue"转换为lambda表达式,然后我可以呼叫Action<IDbDataParameter, object>
.
接口
public interface IDbTypeHandler
{
}
public interface IDbTypeHandler<T> : IDbTypeHandler
{
void SetValue(IDbDataParameter parameter, T value);
}
班级
internal class UniqueidentifierUlIdHandler : IDbTypeHandler<UlId>
{
public void SetValue(IDbDataParameter parameter, UlId value)
{
parameter.Value = value.ToByteArray();
}
}
internal class Char1Handler : IDbTypeHandler<bool>
{
public void SetValue(IDbDataParameter parameter, bool value)
{
parameter.Value = value;
}
}
-update
下面的代码是我想要创建lambda表达式的地方
if (!TryGetValue("Key", out IDbTypeHandler dbTypeHandler))
{
return false;
}
var t = dbTypeHandler.GetType();
var itf = t.GetInterfaces().SingleOrDefault(i => i.IsGenericType);
var xx = itf.GenericTypeArguments[0];
var p0 = Expression.Parameter(t);
var p1 = Expression.Parameter(typeof(IDbDataParameter));
var p2 = Expression.Parameter(xx);
var method = t.GetMethod("SetValue");
Type delegateType = typeof(Action<,,>).MakeGenericType(t, typeof(IDbDataParameter), xx);
var lambda = Expression.Lambda(delegateType, Expression.Call(p0, method, p1, p2), new[] { p0, p1, p2 });
现在,我得到了一辆Lambda.如果我使用.Compile()
,那么它将返回Delegate
类型.但是,我想要Action<IDbDataParameter,object>
分
我知道我需要在var lambda = Expression.Lambda
之前进行打字转换,但我现在不知道该怎么做.