Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算。通常表达式目录树是配合Lambda一起来使用的,lambda可以是匿名方法,当然也可以使用Expression来动态的创建!



我们可以通过下面创建表达式目录树,我们称之为A种方式:
Expression
我们还可以使用Expression来动态创建,我们称之为B种方式:
///
/// 实体类
///
public class People
{
public int Age { get; set; }
public string Name { get; set; }
public int Id;
}
var peopleParam = Expression.Parameter(typeof(People), “x”);//创建一个x,类型为people
//得到x.Id
MemberExpression idParam = Expression.Field(peopleParam, “Id”);
//得到ToString方法
MethodInfo toStringWay = typeof(int).GetMethod(“ToString”, new Type[] { });
//得到IndexOf的方法,然后new Type[]这个代表是得到参数为string的一个方法
MethodInfo indexOfWay = typeof(string).GetMethod(“IndexOf”, new Type[] { typeof(string) });
//通过下面方法得到x.Id.ToString()
MethodCallExpression tostringResult = Expression.Call(idParam, toStringWay, new Expression[] { });
//通过下面方法得到x.Id.ToString().IndexOf(“5”) ,MethodCallExpression继承于Expression
MethodCallExpression indexOfResult = Expression.Call(tostringResult, indexOfWay, new Expression[] { Expression.Constant(“5”) });
//x.Id.ToString().IndexOf(“5”)>=0
var lambdaBody = Expression.GreaterThanOrEqual(indexOfResult, Expression.Constant(0));
//得到x => x.Id.ToString().IndexOf(“5”) >= 0,后面的一个参数指的是x,如果有多个则指定多个
Expression
{ peopleParam });
//通过lambdaResult.Compile()得到Func
bool result = lambdaResult.Compile().Invoke(new People() { Id = 155 });
//普通的Lambda表达式
Func<int,int,int> func = (x,y)=> x + y - 2;
//表达式目录树的Lambda表达式声明方式
Expression<Func<int, int, int>> expression = (x, y) => x + y - 2;
//表达式目录树的拼接方式实现
ParameterExpression parameterx = Expression.Parameter(typeof(int), "x");
ParameterExpression parametery = Expression.Parameter(typeof(int), "y");
ConstantExpression constantExpression = Expression.Constant(2, typeof(int));
BinaryExpression binaryAdd = Expression.Add(parameterx, parametery);
BinaryExpression binarySubtract = Expression.Subtract(binaryAdd, constantExpression);
Expression<Func<int, int, int>> expressionMosaic = Expression.Lambda<Func<int, int, int>>(binarySubtract, new ParameterExpression[]
{
parameterx,
parametery
});
int ResultLambda = func(5, 2);
int ResultExpression = expression.Compile()(5, 2);
int ResultMosaic = expressionMosaic.Compile()(5, 2);
Console.WriteLine($"func:{ResultLambda}");
Console.WriteLine($"expression:{ResultExpression}");
Console.WriteLine($"expressionMosaic:{ResultMosaic}");