1.什么是表达式目录树 :简单的说是一种语法树,或者说是一种数据结构(Expression)
2.用Lambda声明表达式目录树:
Expression<Func<int, int, int>> exp = (n, m) => n * m + 2; //表达试目录树的方法体只能是一行,不能有大括号。比如:
//Expression<Func<int, int, int>> exp1 = (m, n) =>
// {
// return m * n + 2;
// };
3.Expression.Compile();
Func<int, int, int> func = (m, n) => m * n + 2;
Expression<Func<int, int, int>> exp = (m, n) => m * n + 2;
int iResult1 = func.Invoke(99, 99);
int iResult2 = exp.Compile().Invoke(99, 99);
iResult1 和iResult2的结果一样,但是能Compile()的只有LambdaExpression。 Compile() 是将表达式树描述的 Lambda 表达式编译为可执行代码,并生成表示该 lambda 表达式的委托。exp.Compile().Invoke(99,99) 相当于这样调用 exp.Compile()();
4.認識表达式目录树结构。把上面的表达式拆分就是如下图,小学数学知识里的,按照运算符优先级别,先算乘法,m*n,得出结果再算加法,加上2。

如代码所示,m和n是参数,所以类型为ParameterExpression ,2是常量,常量类型是ConstantExpression ,MultiplyAssign 乘法,Add加法。第六步中只能执行表示Lambda表达式的表达式目录树,即LambdaExpression或者Expression<TDelegate>类型。如果表达式目录树不是表示Lambda表达式,需要调用Lambda方法创建一个新的表达式。actExpression.Compile()成委托,再调用。
{
ParameterExpression left = Expression.Parameter(typeof(int), "m");//左边的参数
ParameterExpression right = Expression.Parameter(typeof(int), "n");//右边的参数
ConstantExpression constantlExp = Expression.Constant(2,typeof(int));//常量2
BinaryExpression binaryExpMult = Expression.MultiplyAssign(left, right);//两个参数相乘
BinaryExpression binaryExpAdd=Expression.Add(binaryExpMult, constantlExp);//相乘的结果再加2
Expression<Func<int, int,int>> actExpression = Expression.Lambda<Func<int, int, int>>(binaryExpAdd, left, right);
int result= actExpression.Compile()(2, 1);//调用
Console.WriteLine(result+"");
}
一些表达式目录树常用的类型

5.表达式目录树+缓存
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ThreeHomeWork.Model
{
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class StudentDto
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}










