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
所独有的。在读了更多关于它的内容后,现在我发现它不是。