web-dev-qa-db-ja.com

ラムダから式ツリーへの変換

私はそれを本当にシンプルに保ちます、

ラムダから式ツリーを取得するにはどうすればよいですか?

またはクエリ式から?

ラムダを別のタイプに割り当てる必要があります。

// 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<>型に割り当てると、式ツリーを元に戻すことはできません。

56
Konrad Rudolph

コンラートの回答は正確です。コンパイラが式ツリーを生成するには、ラムダ式をExpression<Func<...>>に割り当てる必要があります。ラムダをFunc<...>Action<...>、または他のデリゲート型として取得する場合、必要なのはIL命令の束だけです。

ILでコンパイルされたラムダを式ツリーに戻すことが本当に必要な場合は、逆コンパイルする必要があります(たとえば、Lutz RoederのReflectorツールが行うことを実行します)。 Cecil ライブラリをご覧になることをお勧めします。このライブラリは、高度なIL操作サポートを提供し、時間を大幅に節約できます。

11
Pierre Arnaud

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);
8
joniba