表达式目录树(一)

(一)Lambda创建表达式目录树

Expressionint, int, int>> exp1 = (a, b) => a * b+2;

说明一下:Func

Func<(Of <(T1, T2, TResult>)>)

泛型委托:封装一个具有两个参数并返回 TResult 参数指定的类型值的方法。

T1:此委托封装的方法的第一个参数类型。

T2:此委托封装的方法的第二个参数类型。

Tresult:此委托封装的方法的返回值类型。

例如:现在求2个int类型的和

(1) 原始的方法

public int Add(int a, int b)
{
    return a + b;
}

(2)通过委托来实现

delegate int deleAdd(int a, int b);
public void DeleConcrete()
{
    deleAdd deleadd= Add;
    deleadd(1, 2);
}

(3)直接通过泛型委托Func来实现

public int GetFunc(int a,int b)
{
    Func<int, int, int> add = Add;
    return add(a, b);
}

(二)分解表达式目录树

这点可能想到小学数学中的四则运算。对于a*b+2来说,先算乘,再算加
用图表示为:
表达式目录树(一)_第1张图片
每个矩形框为一个节点(表达式类型),节点有多种类型。
而这个(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.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));

你可能感兴趣的:(LINQ)