Expressionint, int, int>> exp1 = (a, b) => a * b+2;
说明一下:Func
Func<(Of <(T1, T2, TResult>)>)
泛型委托:封装一个具有两个参数并返回 TResult 参数指定的类型值的方法。
T1:此委托封装的方法的第一个参数类型。
T2:此委托封装的方法的第二个参数类型。
Tresult:此委托封装的方法的返回值类型。
例如:现在求2个int类型的和
public int Add(int a, int b)
{
return a + b;
}
delegate int deleAdd(int a, int b);
public void DeleConcrete()
{
deleAdd deleadd= Add;
deleadd(1, 2);
}
public int GetFunc(int a,int b)
{
Func<int, int, int> add = Add;
return add(a, b);
}
这点可能想到小学数学中的四则运算。对于a*b+2来说,先算乘,再算加
用图表示为:
每个矩形框为一个节点(表达式类型),节点有多种类型。
而这个(a+b)*2的几个节点:
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.Lambdaint, int, int>>(Add, a, b);
//查看表达式
Console.WriteLine(lexp.ToString());
创建方法是通过Expression的工厂方法来创建。
Expressionint, int, int>> lexp = Expression.Lambdaint, int, int>>(Add, a, b);
Func<int, int, int> fun = lexp.Compile();
Console.WriteLine(fun(3,5));