MSDN は次のように述べています。
コンパイラは、式ツリーを構築することもできます。コンパイラによって生成された式ツリーは、常に Expression<TDelegate> 型のノードをルートとします。つまり、そのルート ノードはラムダ式を表します。
しかし、MethodCallExpression、BinaryExpression などのタイプのノードをルートとする式ツリーを構築したい場合はどうすればよいでしょうか? そして、これを手動で行いたくありません。
MSDN は次のように述べています。
コンパイラは、式ツリーを構築することもできます。コンパイラによって生成された式ツリーは、常に Expression<TDelegate> 型のノードをルートとします。つまり、そのルート ノードはラムダ式を表します。
しかし、MethodCallExpression、BinaryExpression などのタイプのノードをルートとする式ツリーを構築したい場合はどうすればよいでしょうか? そして、これを手動で行いたくありません。
回避策は、2 つのヘルパー関数を宣言することです
public Expression GetBody(Expression<Action> lambda)
{
return lambda.Body;
}
public Expression GetBody<TResult>(Expression<Func<TResult>> lambda)
{
return lambda.Body;
}
使用例:
var e1 = (MethodCallExpression)GetBody(() => this.FunA());
var e2 = (ConstantExpression)GetBody(() => 4 + 5);
var e3 = (BinaryExpression)GetBody(() => a + b);