(一)Lambda创建表达式目录树
说明一下:Func
泛型委托:封装一个具有两个参数并返回 TResult 参数指定的类型值的方法。
T1:此委托封装的方法的第一个参数类型。
T2:此委托封装的方法的第二个参数类型。
Tresult:此委托封装的方法的返回值类型。
例如:现在求2个int类型的和
(1) 原始的方法
{
return a + b;
}
(2)通过委托来实现
public void DeleConcrete()
{
deleAdd deleadd = Add;
deleadd( 1 , 2 );
}
(3)直接通过泛型委托Func来实现
{
Func < int , int , int > add = Add;
return add(a, b);
}
(二)分解表达式目录树
这点可能想到小学数学中的四则运算。对于a*b+2来说,先算乘,再算加
用图表示为:
每个矩形框为一个节点(表达式类型),节点有多种类型。
附表表达式类型:
类
|
说明
|
BinaryExpression |
表示包含二元运算符的表达式。 |
ConditionalExpression |
表示包含条件运算符的表达式。 |
ConstantExpression |
表示具有常量值的表达式。 |
ElementInit |
表示 IEnumerable 集合的单个元素的初始值设定项。 |
Expression |
提供一种基类,表示表达式目录树节点的类派生自该基类。它还包含用来创建各种节点类型的 static(在 Visual Basic 中为 Shared)工厂方法。这是一个 abstract 类。 |
Expression<(Of <(TDelegate>)>) |
以表达式目录树的形式将强类型 lambda 表达式表示为数据结构。无法继承此类。 |
InvocationExpression |
表示将委托或 lambda 表达式应用于参数表达式列表的表达式。 |
LambdaExpression |
描述一个 lambda 表达式。 |
ListInitExpression |
表示包含集合初始值设定项的构造函数调用。 |
MemberAssignment |
表示初始化新创建对象的字段或属性。 |
MemberBinding |
提供一种基类,该基类派生表示绑定的类,这些绑定用于初始化新创建对象的成员。 |
MemberExpression |
表示访问字段或属性。 |
MemberInitExpression |
表示调用构造函数并初始化新对象的一个或多个成员。 |
MemberListBinding |
表示初始化新创建对象的集合成员的元素。 |
MemberMemberBinding |
表示初始化新创建对象的成员的成员。 |
MethodCallExpression |
表示调用一种方法。 |
NewArrayExpression |
表示创建新数组并可能初始化该新数组的元素。 |
NewExpression |
表示构造函数调用。 |
ParameterExpression |
表示命名的参数表达式。 |
TypeBinaryExpression |
表示表达式和类型之间的操作。 |
UnaryExpression |
表示包含一元运算符的表达式。 |
而这个(a+b)*2的几个节点:
·a,b是参数,类型为ParameterExpression
·+,*,为二元运符,类型为BinaryExpression
·2为常量,类型为ConstantExpression
(三)通过表达式类型来创建目录树
a*b+2
节点有4个,2个参数,2个运算符,1个常量
·两个参数
ParameterExpression a = Expression.Parameter( typeof ( int ), " a " );
ParameterExpression b = Expression.Parameter( typeof ( int ), " b " );
// 求积
BinaryExpression Multi = Expression.Multiply(a,b);
// 常量
ConstantExpression x2 = Expression.Constant( 2 );
// 求和
BinaryExpression Add = Expression.Add(Multi, x2);
// 创建一个表示lambda表达式的对象
LambdaExpression lexp = Expression.Lambda < Func < int , int , int >> (Add, a, b);
// 查看表达式
Console.WriteLine(lexp.ToString());
创建方法是通过Expression的工厂方法来创建。
(四)使用
Func < int , int , int > fun = lexp.Compile();
Console.WriteLine(fun( 3 , 5 ));
更多内容请参见:
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_fxadvance/html/fb1d3ed8-d5b0-4211-a71f-dd271529294b.htm
http://kb.cnblogs.com/page/42509/?page=1