我会简单明了地回答,
如何从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指令。进一步完善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