[.net 面向對象程序設計進階] (6) Lamda表達式(二) 表達式樹快速入門

[.net 面向對象程序設計進階] (6) Lamda表達式(表達式樹快速入門html

本節導讀:數據庫

認識表達式樹(Expression Tree),學習使用Lambda建立表達式樹,解析表達式樹。express

學習表達式在程序設計中的優勢:好比構造動態查詢、動態構造表達式樹完成未知對象屬性訪問,比反射的性能高出不少。咱們能夠說表達式樹纔是Lambda的精髓,是咱們必需要熟練掌握並靈活運用的。 編程

1.關於表達式樹(Expression Tree) 緩存

表達式樹以樹形數據結構表示代碼,其中每個節點都是一種表達式,好比方法調用和 x < y 這樣的二元運算等。 數據結構

表達式樹,對於剛接觸的人來講,比較難以理解。那麼什麼是表達式樹,通俗點來講,就是使用一種樹形的數據結構來緩存表達式。 性能

2.表達式樹能幫咱們作點什麼? 學習

面咱們說了表達式樹是一種數據結構,那麼爲何要把表達式定義成表達式樹呢,轉成一種數據結構,能幫咱們作點什麼?先明確了他能爲咱們帶來什麼,纔有動力繼續看下去。 spa

說到他的做用,固然是很是有用的,咱們在不少場景下都要使用他,當表達式變爲一個表達式樹的數據結構時,表達式就變爲一個對象,你能夠對錶達式樹中的對象元素(表達式的代碼)進行編輯和運算。下面列舉幾種經常使用的: .net

  1. 經過修改表達式樹可以動態修改可執行代碼
  2. 在不一樣數據庫中執行 LINQ 查詢
  3. 建立動態查詢。
  4. 完成相似反射訪問未知對象屬性,經過動態構造表達式樹,生成委託。 

3. 表達式樹的建立 

命名空間: System.Linq.Expressions  

建立表達式樹示例: 

Expression<Func<int, int, bool>>  expression  =  (num,num2)=> num < num2;

這個語句包含三個部分: 

  1. 一個聲明Func<int, int, int> function
  2. 一個等號: =
  3. 一個lambda表達式(num,num2)=> num < num2; 

expression 就是一個類型爲Expression<T>的表達式樹,能夠看出,他並不是是一個可執行代碼,而是一種表達式樹的數據結構。 

 4. 表達式樹結構的構成 

Expression<Func<int, int, bool>>  expression  =  (num,num2)=> num < num2;

經過監視咱們定義好的表達式樹,能夠看到其構成 

 下面咱們對幾個重要屬性說明: 

  • Body: 獲得表達式的主體例:(num < num2)    其中,Body中又包含屬性Left和Right  在上例中分別爲num和num2
  • Parameters: 獲得lambda表達式的參數。 例 {num,num2}
  • NodeType: 獲取樹的節點的ExpressionType。共45種不一樣值,包含全部表達式節點各類可能的類型。例如返回常量,例如返回參數,例如取兩個值的小值(<),例如取兩個值的大值(>),例如將值相加(+),等等。例:Lambda
  • Type: 獲取表達式的一個靜態類型 例:Func<int, int, bool>  
  • ReturnType:這個是表達式的返回類型   例:bool 

還有一些其餘屬性Name、CanReduce等,這些不是很經常使用。  

5.解析表達式樹 

  咱們瞭解了表達式樹結構的組成,解析表達式變得至關容易了,下面咱們直接經過一個示例來完成對一個表達式樹的解析:  

//表達式樹(Expression)
Expression<Func<int, int, bool>> expression = (x, y) => x!=0 && x==y+1;

BinaryExpression exr = expression.Body as BinaryExpression;
IReadOnlyList<ParameterExpression> param = expression.Parameters as IReadOnlyList<ParameterExpression>;
BinaryExpression left = exr.Left as BinaryExpression;
BinaryExpression right = exr.Right as BinaryExpression;
ExpressionType exrType = exr.NodeType;

ParameterExpression leftLeft = left.Left as ParameterExpression;
ConstantExpression leftRight = left.Right as ConstantExpression;
ExpressionType leftType = left.NodeType;

ParameterExpression rightLeft = right.Left as ParameterExpression;
BinaryExpression rightRight = right.Right as BinaryExpression;
ExpressionType rightType = right.NodeType;

ParameterExpression rightRightLeft = rightRight.Left as ParameterExpression;
ExpressionType rightRightType = rightRight.NodeType;
ConstantExpression rightRightRight = rightRight.Right as ConstantExpression;          

Console.WriteLine(exr.ToString());

 表達式樹的解析,裏面的元素無非就下面幾種:  

A.BinaryExpression 包含二元運算符的表達式 

B.ParameterExpression命名的參數表達式 ,通常是一組參數集合IReadOnlyList<ParameterExpression> 

C.ConstantExpression常量值的表達式 

D.ExpressionType節點類型 

對於上面示例的表達樹結構,我用圖例的方式展示以下:

  

對於上面的結構,咱們能夠按上面代碼中的對象元素變量與之一一對應以下圖:  

 

要點:

本節咱們介紹了表達式樹在.NET面向對象程序設計中的做用、表達式樹的建立與解析,相信小夥伴們對錶達式樹這種結構比較瞭解了。

表達式樹(Expression Tree)就是一種使用對象的方式來描述表達式。這也正是.NET一切皆是對象的思想體現。 

下一節咱們會介紹動態建立一個表達式樹結構、會舉列說明幾種表達式樹在.NET程序設計中的應用。

==============================================================================================  

 返回目錄

 <若是對你有幫助,記得點一下推薦哦,若有有不明白或錯誤之處,請多交流>  

<對本系列文章閱讀有困難的朋友,請先看《.net 面向對象編程基礎》>

<轉載聲明:技術須要共享精神,歡迎轉載本博客中的文章,但請註明版權及URL>

.NET 技術交流羣:467189533    .NET 程序設計

==============================================================================================   

相關文章
相關標籤/搜索