我会保持非常简单,
如何从 lambda 中获取表达式树?
还是从查询表达式?
您必须将 lambda 分配给不同的类型:
// Gives you a delegate:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;
方法参数也是如此。但是,一旦将这样的 lambda 表达式分配给一个Func<>
类型,就无法取回表达式树。
康拉德的回答是准确的。您需要将 lambda 表达式分配给Expression<Func<...>>
,以便编译器生成表达式树。如果你得到一个 lambda或其他委托类型Func<...>
,Action<...>
那么你所拥有的只是一堆 IL 指令。
如果您确实需要能够将 IL 编译的 lambda 转换回表达式树,则必须对其进行反编译(例如,执行 Lutz Roeder 的 Reflector 工具所做的事情)。我建议看一下Cecil库,它提供了高级 IL 操作支持,可以为您节省相当多的时间。
只是为了扩展 Konrad 的答案并纠正 Pierre,您仍然可以从 IL 编译的 lambda 生成表达式,尽管它不是非常优雅。扩充康拉德的例子:
// Gives you a lambda:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);