这篇博客只能用来批判因为我刚刚学习linq对它了解只有简单的linq to sql 的语句所以来写这个博客只能说是班门弄斧了,看的下去的话就坚持看吧。
在网上看了别人的文章目前水平有限借鉴别人的思想吧。
描述:表达式树是将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和执行代码。
示例:
void Main()
{
Expression<Func<int,int>> tree = x=>x+1;
Func<int,int> exp= x=> x+1;
tree(1);//'tree' is a 'variable' but is used like a 'method'(“树”是一个“变量”,但使用的是“方法”)
exp(1);//输出2
}
{
Expression<Func<int,int>> tree = x=>x+1;
Func<int,int> exp= x=> x+1;
tree(1);//'tree' is a 'variable' but is used like a 'method'(“树”是一个“变量”,但使用的是“方法”)
exp(1);//输出2
}
如果用Console.WriteLine(tree.ToString());
// x=> (x + 1)输出结果是x=> (x + 1)
tree只是lambada表达式的树形结构信息,并不是函数可以直接调用
上面的 Expression<Func<int,int>> tree = x=>x+1;左面 Expression<Func<int,int>> tree 是一个树,
右面 x=>x+1是一个表达式,Func<int,int>中的两个类型是这样的最后一个类型是返回值的类型前面的是参数类型对于表达式 x=>x+1来说参数x类型为int最后
计算结果返回值类型也会是int。而 Func<int,int>又是作为 Expression<T>中的类型它的类型是一个表达式,就好像这个树是由最底层的单个
参数和一些逻辑操作,运算操作等一级一级构成(这是我个人目前的理解不对请指正)
但是不管怎么构建这棵树我们的目的还是要使用它的,所以怎样使用呢?
那就是Compile()函数了,它由Expression类提供,下面是使用:
Func<int,int> fun= tree.Compile();
fun(3).Dump();//用来输出
上面可能不直观那看下面:
ConstantExpression ce1 = Expression.Constant(10);//这个没有什么好疑义的就是返回10这个常量
Expression<Func<
int
>> exp = Expression.Lambda<Func<
int
>>(ce1);
Console.WriteLine(exp.Compile().Invoke());
下面我们来看怎样构建一个表达式树:
首先看几个类型
下面看代码:(直角三角形的判断)
1.创建参数
ParameterExpression expX= Expression.Parameter(typeof(int),"x");
ParameterExpression expY= Expression.Parameter(typeof(int),"y");
ParameterExpression expZ= Expression.Parameter(typeof(int), "z");
2.计算
BinaryExpression mulX = Expression.Multiply(expX, expX);
BinaryExpression mulY= Expression.Multiply(expY, expY);
BinaryExpression mulZ= Expression.Multiply(expZ, expZ);
BinaryExpression addXY = Expression.Add(mulX,mulY);
3.最后的关联
BinaryExpression final= Expression.Equal(mulZ, addXY);
如果感觉欠缺点什么,那么看下面我们把它放到程序main中是不是更直观一点呢?
void Main()
{
ParameterExpression expX= Expression.Parameter(typeof(int),"x");
ParameterExpression expY= Expression.Parameter(typeof(int),"y");
ParameterExpression expZ= Expression.Parameter(typeof(int), "z");
BinaryExpression mulX= Expression.Multiply(expX, expX);
BinaryExpression mulY= Expression.Multiply(expY, expY);
BinaryExpression mulZ= Expression.Multiply(expZ, expZ);
BinaryExpression addXY = Expression.Add(mulX,mulY);
BinaryExpression final= Expression.Equal(mulZ, addXY);//(x*x + y*y)== z*z
Expression<Func<int, int, int, bool>> square = Expression.Lambda<Func<int, int, int, bool>>(final, expX, expY, expZ);
Func<int, int, int, bool> result= square.Compile();
result result(3,4,5).Dump();
}
结果:
True
{
ParameterExpression expX= Expression.Parameter(typeof(int),"x");
ParameterExpression expY= Expression.Parameter(typeof(int),"y");
ParameterExpression expZ= Expression.Parameter(typeof(int), "z");
BinaryExpression mulX= Expression.Multiply(expX, expX);
BinaryExpression mulY= Expression.Multiply(expY, expY);
BinaryExpression mulZ= Expression.Multiply(expZ, expZ);
BinaryExpression addXY = Expression.Add(mulX,mulY);
BinaryExpression final= Expression.Equal(mulZ, addXY);//(x*x + y*y)== z*z
Expression<Func<int, int, int, bool>> square = Expression.Lambda<Func<int, int, int, bool>>(final, expX, expY, expZ);
Func<int, int, int, bool> result= square.Compile();
result result(3,4,5).Dump();
}
结果:
True
似乎明白了一些吧,但是感觉还是不够清晰不够有条理性,因为目前能力有限只能零星的了解等进一步的学习后希望会有一个系统的深入了解。
后面的任意参数构建、以及树的遍历还会抽时间学习,最近确实时间不够多,只能抽时间看看,人家一小时学会那么我就话更多的时间去学,可
能我个人速度慢消化的少但是会继续努力,我相信总会学会的。之后还会继续追加内容的。