天天看点

Linq之Expression高级篇(常用表达式类型)

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t1" target="_blank">写在前面</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t2" target="_blank">系列文章</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t3" target="_blank">变量表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t4" target="_blank">常量表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t5" target="_blank">条件表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t6" target="_blank">赋值表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t7" target="_blank">二元运算符表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t8" target="_blank">一元运算符表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t9" target="_blank">循环表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t0" target="_blank">块表达式</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4234747.html#t01" target="_blank">总结</a>

首先回顾一下上篇文章的内容,上篇文章介绍了表达式树的解析和编译。如果忘记了,可以通过下面系列文章提供的入口进行复习。这篇文章将介绍常见的表达式类型。

常见的表达式类型都有个共同的基类expression。创建这些类型的对象,是通过api的方式创建的(也就是expression的静态方法),首先引入命名空间:

<a href="http://www.cnblogs.com/wolf-sun/p/4199383.html">linq之lambda表达式初步认识</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4206982.html">linq之lambda进阶</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4214164.html">linq之隐式类型、自动属性、初始化器、匿名类</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4216256.html">linq之扩展方法</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4222473.html">linq之expression初见</a>

<a href="http://www.cnblogs.com/wolf-sun/p/4230226.html">linq之expression进阶</a>

在表达式树中使用parameterexpression或者parameterexpression表达式表示变量类型,下面看一个例子,我们定义一个int类型的变量i:

或者使用

通过f12转到定义,发现这两个方法的注释几乎是一样的。静态方法parameter第一个参数:定义的参数类型,第二个参数:为参数名称。

在表达式树中使用constantexpression表达式表示具有常量值的表达式。,看一个例子,我们定义一个int类型的常量5.并将该值赋值给上面定义的变量i

Linq之Expression高级篇(常用表达式类型)
Linq之Expression高级篇(常用表达式类型)

constrant方法第一个参数:常量,第二个参数为什么类型的常量。

这里提到了binaryexpression表达式,该表达式标识包含二元运算符的表达式,类似与=,&gt;这样的二元表达式都可以使用binaryexpression表达式来表示。

调试模式下,在自动窗口查看当前表达式的debugview属性,这个属性在调试表达式树的时候是非常有用的:

变量:

Linq之Expression高级篇(常用表达式类型)

常量:

Linq之Expression高级篇(常用表达式类型)

二元表达式:

Linq之Expression高级篇(常用表达式类型)

通过观察上面的图,可知变量调试模式下debugview属性将显示前面带有“$”符号的 parameterexpression 变量名称。那么如果参数没有名称,则会为其分配一个自动生成的名称,例如 $var1 或 $var2(这里不再举例)。

在很多时候,我们都需要使用条件表达式来过滤一些数据,然后返回满足条件的数据,在表达式中有这样一些表达式满足你的需求。

常见运算符

&gt;,&gt;=

Linq之Expression高级篇(常用表达式类型)

&lt;,&lt;=

Linq之Expression高级篇(常用表达式类型)

if....then:如果满足条件那么..

if...then...else:如果满足条件执行某某代码,否则执行另外的逻辑

Linq之Expression高级篇(常用表达式类型)

一个例子

ifthenelse方法

Linq之Expression高级篇(常用表达式类型)
Linq之Expression高级篇(常用表达式类型)

输出结果

Linq之Expression高级篇(常用表达式类型)

 例子描述:条件test包装为常量表达式,因为test为true,所以执行iftrue的表达式,并调用writeline方法打印出信息。

=

还以上面为变量i赋值的例子为例

+=

-=

*=

/=

举一个例子

Linq之Expression高级篇(常用表达式类型)
Linq之Expression高级篇(常用表达式类型)

结果

Linq之Expression高级篇(常用表达式类型)

在上面也提到了部分二元运算符表达式,类似加减乘除这样的运算符,对于二元运算符,就不再举例。这些返回的表达式树,都可以使用binaryexpression来接收,或者使用基类expression接收,或者更省事,使用var关键字。

类似++,--运算符

i++等价于i=i+1,运算顺序就是i先加1,然后再赋值给i。在表达式书中使用expression的postincrementassign方法来进行自增或者自减操作。返回结果为unaryexpression类型,同样可以使用基类expression接收,或者var。

在表达式树中使用expression的loop方法实现循环。

在前面的文章中,也说了不能使用lambda方式创建带块级的表达式树,不然会有如下的错误

Linq之Expression高级篇(常用表达式类型)

通过api的方式可以创建块级表达式树,其中expression的block方法功不可没。例如上面的加减乘除的例子中,可以包括多个expression。

那么,下面就举一个包含自增的一元表达式,循环的表达式块,并输出结果。

输出1-100之间的所有偶数。

Linq之Expression高级篇(常用表达式类型)
Linq之Expression高级篇(常用表达式类型)
Linq之Expression高级篇(常用表达式类型)

本篇文章介绍了几种常见的表达式类型,当然,还有很多并没有列出,比如switch case,try catch等。如果在项目中需要创建复杂的表达式树,expression的静态方法block是必不可少的。希望通过本篇的学习,对你了解expression有所帮助。

参考文章

https://msdn.microsoft.com/zh-cn/library/dd323961(v=vs.110).aspx

https://msdn.microsoft.com/zh-cn/library/bb397951.aspx

博客地址:

<a href="http://www.cnblogs.com/wolf-sun">http://www.cnblogs.com/wolf-sun/</a>

博客版权:

本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。

如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!

再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/4234747.html