【发布时间】:2009-09-15 14:06:09
【问题描述】:
MSDN 说:
编译器还可以构建一个 表达式树为您服务。一种 编译器生成的表达式树是 始终植根于类型的节点 表达式
;也就是说,它的 根节点代表一个 lambda 表达。
但是,如果我想构建一个以 MethodCallExpression、BinaryExpression 等类型的节点为根的表达式树怎么办?并且不想手动执行此操作。
【问题讨论】:
MSDN 说:
编译器还可以构建一个 表达式树为您服务。一种 编译器生成的表达式树是 始终植根于类型的节点 表达式
;也就是说,它的 根节点代表一个 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);
【讨论】: