(一)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-a
http://kb.cnblogs.com/page/42509/?page=1