LambdaExpression如何解析为Expression>在运行时通过动态

本文关键字:运行时 动态 return 何解析 Expression LambdaExpression Func | 更新日期: 2023-09-27 18:14:49

我有一些工作代码,其中不同类型的Expression<Func<T, returnT>>对象被放置在List<LambdaExpression>中,然后在运行时通过使用dynamic与接受Expression<Func<T, returnT>>的方法匹配。这是我第一次使用dynamic,但我觉得我很了解它的角色/功能。我好奇的是从LambdaExpressionExpression<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?
}

LambdaExpression如何解析为Expression<Func<T, return >>在运行时通过动态

Expression<TDelegate>来源于LambdaExpression

从MSDN:

在运行时,表示lambda的表达式树节点expression总是类型为expression .

除了Expression<TDelegate>派生自LambdaExpression之外-您正在将LambdaExpression转换为动态-它使用DLR来确定对象的类型。

现在你的对象不是LambdaExpression,而是运行时它的类型。因为你正在调用方法重载,所以它知道要调用哪个重载。

在使用静态类型(var/LambdaExpression)时,重载是在运行时确定的。在你的情况下,没有LambdaExpression过载,所以如果不转换为动态,它将无法编译。

使用动态类型时,重载是在运行时使用DLR

确定的