私はそれを本当にシンプルに保ちます、
ラムダから式ツリーを取得するにはどうすればよいですか?
またはクエリ式から?
ラムダを別のタイプに割り当てる必要があります。
// Gives you a delegate:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;
同じことがメソッド引数にも当てはまります。ただし、このようなラムダ式をFunc<>
型に割り当てると、式ツリーを元に戻すことはできません。
コンラートの回答は正確です。コンパイラが式ツリーを生成するには、ラムダ式をExpression<Func<...>>
に割り当てる必要があります。ラムダをFunc<...>
、Action<...>
、または他のデリゲート型として取得する場合、必要なのはIL命令の束だけです。
ILでコンパイルされたラムダを式ツリーに戻すことが本当に必要な場合は、逆コンパイルする必要があります(たとえば、Lutz RoederのReflectorツールが行うことを実行します)。 Cecil ライブラリをご覧になることをお勧めします。このライブラリは、高度なIL操作サポートを提供し、時間を大幅に節約できます。
Konradの答えを拡張し、Pierreを修正するために、ILでコンパイルされたラムダから式を生成することはできますが、それほどエレガントではありません。コンラートの例の拡張:
// Gives you a lambda:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);