我会简单明了地回答,
如何从lambda表达式中获取表达树?
或从查询表达式中获取?
我会简单明了地回答,
如何从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<> 类型,你就无法获取表达式树了。
Expression<Func<...>>,以便编译器生成表达式树。如果您获得lambda作为Func<...>,Action<...>或其他委托类型,则只有一堆IL指令。
如果您真的需要能够将已编译的IL lambda转换回表达式树,则必须对其进行反编译(例如执行Lutz Roeder的Reflector工具所做的操作)。我建议看看Cecil库,它提供了高级IL操作支持,并可以节省您很多时间。
进一步完善Konrad的回答并纠正Pierre的错误,尽管它不太优雅,但仍然可以从编译成IL的lambda生成表达式。扩展Konrad的示例:
// Gives you a lambda:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);
// Gives you a lambda:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = ExpressionTree.Parse(f);
f是一个委托。但是x => x * 2是一个 lambda 表达式(正如你自己所指出的)。你的评论暗示我说了不同的话,但实际上我并没有。 - Konrad Rudolphx => x * 2既可以分配给Func<int,int>又可以分配给Expression<Func<int,int>>?x => x * 2的CLR类型是什么?这是否意味着Func<int,int>和Expression<Func<int,int>>派生自相同的基类型? - KFL