49

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

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

またはクエリ式から?

4

3 に答える 3

67

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

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

于 2009-08-21T08:43:02.063 に答える
11

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

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

于 2009-08-21T08:57:51.127 に答える
8

Konrad の回答を拡張し、Pierre を修正するために、IL でコンパイルされたラムダから Expression を生成することはできますが、それほどエレガントではありません。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);
于 2011-01-18T14:43:42.547 に答える