Dynamic 如何使用动态确定的类型作为Lambda的参数<;Func<&燃气轮机>;?
我正在动态地为一个类型创建一个Lambda表达式(基于用户输入,但目前使用虚拟值进行概念验证),我只在运行时知道该类型。因此,我需要将Dynamic 如何使用动态确定的类型作为Lambda的参数<;Func<&燃气轮机>;?,dynamic,lambda,c#-3.0,Dynamic,Lambda,C# 3.0,我正在动态地为一个类型创建一个Lambda表达式(基于用户输入,但目前使用虚拟值进行概念验证),我只在运行时知道该类型。因此,我需要将Func的T部分作为动态类型传递,因为直到运行时我才知道该类型(TResult将始终是bool) 似乎我无法传入Type变量,也无法将typeof与泛型一起使用。基本上,我正在尝试这样做: // (f => f.Baz == 1) Type theType = Type.GetType("Foo"); ParameterExpression pe = Exp
Func
的T
部分作为动态类型传递,因为直到运行时我才知道该类型(TResult
将始终是bool
)
似乎我无法传入Type
变量,也无法将typeof
与泛型一起使用。基本上,我正在尝试这样做:
// (f => f.Baz == 1)
Type theType = Type.GetType("Foo");
ParameterExpression pe = Expression.Parameter(theType, "f");
Expression left = Expression.Property(pe, theType.GetProperty("Baz"));
Expression right = Expression.Constant(1);
Expression expr = Expression.Equal(left, right);
// This works fine but uses a hard-coded type, which I won't know until runtime:
// var lambda = Expression.Lambda<Func<Foo,bool>>(expr, new ParameterExpression[] { pe }).Compile();
var lambda = Expression.Lambda<Func<theType, bool>>(expr, new ParameterExpression[] { pe }).Compile();
/(f=>f.Baz==1)
键入Type=Type.GetType(“Foo”);
ParameterExpression pe=Expression.Parameter(类型为“f”);
Expression left=Expression.Property(pe,type.GetProperty(“Baz”);
表达式右=表达式常数(1);
表达式expr=表达式.Equal(左、右);
//这很好,但使用了硬编码类型,直到运行时我才知道:
//var lambda=Expression.lambda(expr,新参数Expression[]{pe}).Compile();
var lambda=Expression.lambda(expr,新参数Expression[]{pe}).Compile();
但是,我不能将变量theType
用作Func的T
部分。我怎样才能解决这个问题 不,你不能
例如,在C#中,您不能:
Type t = typeof(int);
List<t> list = new List<t>();
或
//lambda==Func
委托lamdba=Expression.Lambda(expr,新参数Expression[]{pe}).Compile();
bool res=(bool)lambda2.DynamicInvoke(t);
一些基准测试(在StopWatch.Ticks中,只查看它们的比例)(释放模式+启动而不调试+一些无用的周期,以便它们“热”):
236384685动态
56773593 Func+cast
10556024247 DynamicInvoke
值得注意的是,Func
具有相同的速度,因此在额外施法中不会损失任何速度
你可以在这里看到代码
object list = new List<t>();
// lambda == Func<Foo, bool>
dynamic lamdba = Expression.Lambda(expr, new ParameterExpression[] { pe }).Compile();
bool res = lambda(myvalue);
// lambda == Func<Foo, bool>
Delegate lamdba = Expression.Lambda(expr, new ParameterExpression[] { pe }).Compile();
bool res = (bool)lambda2.DynamicInvoke(t);
236384685 dynamic
56773593 Func<object, bool> + cast
10556024247 DynamicInvoke