我有一些工作代码,其中Expression<Func<T, returnT>>
个不同类型的对象放在List<LambdaExpression>
中,然后在运行时与使用Expression<Func<T, returnT>>
接受dynamic
的方法匹配}。这是我第一次使用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?
}
答案 0 :(得分:1)
答案 1 :(得分:1)
除了Expression<TDelegate>
派生自LambdaExpression
之外 - 您正在将LambdaExpression
转换为动态 - 它使用DLR来确定对象的类型。
现在你的对象不是LambdaExpression
,而是它在运行时的类型。因为你正在调用方法重载,它知道要调用哪个重载。
当您使用静态类型(var
/ LambdaExpression
)时,将在运行时确定重载。在您的情况下,没有LambdaExpression
重载,因此如果不转换为动态,它将无法编译。
使用动态类型时,使用DLR
确定运行时的重载