Dynamic 如何使用动态确定的类型作为Lambda的参数<;Func<&燃气轮机>;?

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

我正在动态地为一个类型创建一个Lambda表达式(基于用户输入,但目前使用虚拟值进行概念验证),我只在运行时知道该类型。因此,我需要将
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