1.动态创建表达式树
上一节中通过对表达式树结构和解析表达式的学习以后,动态创建表达式树,已经变得非常简单了,下面我们使
用表达式树动态创建下节的 Lambda 表达式。
先看我们要最终完成的原表达式:
Expression<Func<int, int, bool>> expression = (x, y) => x != 0 && x == y+1;
动态创建过程如下:
//动态创建表达式树
Expression<Func<int, int, bool>> expression = (x, y) => x != 0 && x == y + 1;
//先创建两个参数
ParameterExpression[] parameters = new ParameterExpression[]
{ Expression.Parameter(typeof(int),"x"), Expression.Parameter(typeof(int), "y") };
ParameterExpression param1 = parameters[0];
ParameterExpression param2 = parameters[1];
//下面先创建右边第一个表达式x!=0//(1)常量0x
ConstantExpression rightLeftRight = Expression.Constant(0, typeof(int));//(2)创建左边第一个表达式x!=0
BinaryExpression rightLeft = Expression.NotEqual(param1, rightLeftRight);
//下面创建右边第二个表达式x==y+1//(3) 先创建右边部分表达式 y+1
BinaryExpression rightRightRight = Expression.Add(param2, Expression.Constant(1, typeof(int)));
//(4)创建右边表达式x==y+1
BinaryExpression rightRight = Expression.Equal(param1, rightRightRight);
//5)创建表达式右部整体x != 0 && x == y + 1
BinaryExpression Right = Expression.AndAlso(rightLeft, rightRight);
//(6)完成整个表达式
Expression<Func<int, int, bool>> lambdaExr = Expression.Lambda<Func<int, int,
bool>>(Right,parameters);
Console.Write(lambdaExr.ToString());
运行结果如下:
上面创建过程如下:
2.执行表达式树
动态创建完成上面的表达式,我们肯定最终结果是要使用这个表达式进行处理一些问题,对于动态创建的表达式
树如何执行呢?这个问题非常容易,只需要两个步聚:
A.Compiling编程表达式树为委托
B.调用表达式树(调用该委托)