<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


constrant方法第一個參數:常量,第二個參數為什麼類型的常量。
這裡提到了binaryexpression表達式,該表達式辨別包含二進制運算符的表達式,類似與=,>這樣的二進制表達式都可以使用binaryexpression表達式來表示。
調試模式下,在自動視窗檢視目前表達式的debugview屬性,這個屬性在調試表達式樹的時候是非常有用的:
變量:
常量:
二進制表達式:
通過觀察上面的圖,可知變量調試模式下debugview屬性将顯示前面帶有“$”符号的 parameterexpression 變量名稱。那麼如果參數沒有名稱,則會為其配置設定一個自動生成的名稱,例如 $var1 或 $var2(這裡不再舉例)。
在很多時候,我們都需要使用條件表達式來過濾一些資料,然後傳回滿足條件的資料,在表達式中有這樣一些表達式滿足你的需求。
常見運算符
>,>=
<,<=
if....then:如果滿足條件那麼..
if...then...else:如果滿足條件執行某某代碼,否則執行另外的邏輯
一個例子
ifthenelse方法


輸出結果
例子描述:條件test包裝為常量表達式,因為test為true,是以執行iftrue的表達式,并調用writeline方法列印出資訊。
=
還以上面為變量i指派的例子為例
+=
-=
*=
/=
舉一個例子


結果
在上面也提到了部分二進制運算符表達式,類似加減乘除這樣的運算符,對于二進制運算符,就不再舉例。這些傳回的表達式樹,都可以使用binaryexpression來接收,或者使用基類expression接收,或者更省事,使用var關鍵字。
類似++,--運算符
i++等價于i=i+1,運算順序就是i先加1,然後再指派給i。在表達式書中使用expression的postincrementassign方法來進行自增或者自減操作。傳回結果為unaryexpression類型,同樣可以使用基類expression接收,或者var。
在表達式樹中使用expression的loop方法實作循環。
在前面的文章中,也說了不能使用lambda方式建立帶塊級的表達式樹,不然會有如下的錯誤
通過api的方式可以建立塊級表達式樹,其中expression的block方法功不可沒。例如上面的加減乘除的例子中,可以包括多個expression。
那麼,下面就舉一個包含自增的一進制表達式,循環的表達式塊,并輸出結果。
輸出1-100之間的所有偶數。


本篇文章介紹了幾種常見的表達式類型,當然,還有很多并沒有列出,比如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