C# LambdaExpression如何解析为表达式<;Func<;T、 returnT>&燃气轮机;在运行时通过动态?

C# LambdaExpression如何解析为表达式<;Func<;T、 returnT>&燃气轮机;在运行时通过动态?,c#,linq,generics,dynamic,lambda,C#,Linq,Generics,Dynamic,Lambda,我有一些工作代码,其中不同类型的Expression对象被放置在列表中,然后在运行时使用动态与接受Expression的方法匹配。这是我第一次使用dynamic,但我觉得我对它的作用/功能理解得足够透彻。我好奇的是从LambdaExpression到Expression的关系/解析。代码如下: public void DoIt(Expression<Func<Record, string>> expr) { ... } public void DoIt(Expressio

我有一些工作代码,其中不同类型的
Expression
对象被放置在
列表中
,然后在运行时使用
动态
与接受
Expression
的方法匹配。这是我第一次使用
dynamic
,但我觉得我对它的作用/功能理解得足够透彻。我好奇的是从
LambdaExpression
Expression
的关系/解析。代码如下:

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?
}
public void DoIt(表达式表达式){…}
公共void DoIt(表达式表达式){…}
公共void DoIt(表达式表达式){…}
公开课记录{
公共字符串成员1;
公共国际成员2;
公共日期时间?成员3;
}
表达式expr1=r=>r.Member1;
表达式expr2=r=>r.Member2;
表达式expr3=r=>r.Member3;
var myList=新列表(){
expr1,expr2,expr3
};
//后来。。。
foreach(myList中的var expr)
{
DoIt((动态)expr);
//使用此LambdaExpression对象时发生了什么
//以便它分派适当的DoIt方法?
}
表达式
源自
LambdaExpression

发件人:

在运行时,表示lambda的表达式树节点 表达式的类型始终为expression


除了
Expression
源于
LambdaExpression
这一事实之外,您正在将
LambdaExpression
转换为动态-这将使用DLR来确定对象的类型

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

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


使用动态键入时,重载是在运行时使用DLR

搜索动态分派来确定的。比如这里的Thx。我知道这是动态分派,但我想我认为这个实例中的动态行为是
LambdaExpression
所独有的。在读了更多关于它的内容后,现在我发现它不是。