LambdaExpression如何解析为Expression>在运行时通过动态
本文关键字:运行时 动态 return 何解析 Expression LambdaExpression Func | 更新日期: 2023-09-27 18:14:49
我有一些工作代码,其中不同类型的Expression<Func<T, returnT>>
对象被放置在List<LambdaExpression>
中,然后在运行时通过使用dynamic
与接受Expression<Func<T, returnT>>
的方法匹配。这是我第一次使用dynamic
,但我觉得我很了解它的角色/功能。我好奇的是从LambdaExpression
到Expression<Func<T, returnT>>
的关系/解决方案。代码如下:
public void DoIt(Expression<Func<Record, string>> expr) { ... }
public void DoIt(Expression<Func<Record, int?>> expr) { ... }
public void DoIt(Expression<Func<Record, DateTime?>> expr) { ... }
public class Record {
public string Member1;
public int? Member2;
public DateTime? Member3;
}
Expression<Func<Record, string>> expr1 = r => r.Member1;
Expression<Func<Record, int?>> expr2 = r => r.Member2;
Expression<Func<Record, DateTime?>> expr3 = r => r.Member3;
var myList = new List<LambdaExpression>() {
expr1, expr2, expr3
};
//later...
foreach (var expr in myList)
{
DoIt((dynamic) expr);
//What is happening w/ this LambdaExpression obj
//so that it dispatches the appropriate DoIt method?
}
Expression<TDelegate>
来源于LambdaExpression
。
在运行时,表示lambda的表达式树节点expression总是类型为expression
.
除了Expression<TDelegate>
派生自LambdaExpression
之外-您正在将LambdaExpression
转换为动态-它使用DLR来确定对象的类型。
现在你的对象不是LambdaExpression
,而是运行时它的类型。因为你正在调用方法重载,所以它知道要调用哪个重载。
在使用静态类型(var
/LambdaExpression
)时,重载是在运行时确定的。在你的情况下,没有LambdaExpression
过载,所以如果不转换为动态,它将无法编译。
使用动态类型时,重载是在运行时使用DLR