LambdaExpression如何解析为表达式<func <t,returnt =“”>&gt;在运行时通过动态?

时间:2016-10-25 19:40:57

标签: c# linq generics dynamic lambda

我有一些工作代码,其中Expression<Func<T, returnT>>个不同类型的对象放在List<LambdaExpression>中,然后在运行时与使用Expression<Func<T, returnT>>接受dynamic的方法匹配}。这是我第一次使用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?
}

2 个答案:

答案 0 :(得分:1)

Expression<TDelegate>来自LambdaExpression

来自MSDN

  

在运行时,表示lambda的表达式树节点   表达式总是表达式&lt; TDelegate&gt;。

答案 1 :(得分:1)

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

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

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

使用动态类型时,使用DLR

确定运行时的重载