私はそれを本当にシンプルに保ちます、
ラムダから式ツリーを取得するにはどうすればよいですか?
またはクエリ式から?
ラムダを別のタイプに割り当てる必要があります。
// 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 ツールが行うことを行います)。高度な IL 操作のサポートを提供し、かなりの時間を節約できるCecilライブラリを確認することをお勧めします。
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);