MSDN 说:
编译器还可以为您构建表达式树。编译器生成的表达式树始终植根于 Expression<TDelegate> 类型的节点;也就是说,它的根节点代表一个 lambda 表达式。
但是,如果我想构建一个以 MethodCallExpression、BinaryExpression 等类型的节点为根的表达式树呢?并且不想手动执行此操作。
MSDN 说:
编译器还可以为您构建表达式树。编译器生成的表达式树始终植根于 Expression<TDelegate> 类型的节点;也就是说,它的根节点代表一个 lambda 表达式。
但是,如果我想构建一个以 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);