我们先创建一个表达式树:
Expression<Func<int, int, int>> expression = (a,b) => a + b;
我们的例子是一个Expression<TDelegate>。Expression<TDelegate>类有四个属性:
- Body: 得到表达式的主体。
- Parameters: 得到lambda表达式的参数.
- NodeType: 获取树的节点的ExpressionType。共45种不同值,包含所有表达式节点各种可能的类型,例如返回常量,例如返回参数,例如取两个值的小值(<),例如取两个值的大值(>),例如将值相加(+),等等。
- Type: 获取表达式的一个静态类型。在这个例子里,表达式的类型是Func<int, int, int>
下面就写Code来解析
Expression<Func<int, int, int>> expression = (a, b) => a + b; BinaryExpression body = (BinaryExpression)expression.Body; ParameterExpression left = (ParameterExpression)body.Left; ParameterExpression right = (ParameterExpression)body.Right; Console.WriteLine(expression.Body); Console.WriteLine(" 表达式左边部分: " + "{0}{4} 节点类型: {1}{4} 表达式右边部分: {2}{4} 类型: {3}{4}", left.Name, body.NodeType, right.Name, body.Type, Environment.NewLine);
输出:
(a + b)
表达式左边部分: a
节点类型: Add
表达式右边部分: b
类型: System.Int32
我们可以调用Compile()方法来生成委托对象
int res = expression.Compile()(3, 5);
这段代码会输出值8,跟本文最初声明的lambda函数的执行结果一样。
Expression参考博客:http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html
时间: 2024-11-09 00:52:39