小編給大家分享一下如何創建LINQ Expression tree節點,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創建LINQ Expression tree節點
當了解LINQ Expression tree的概念后,就可以來討論一下這棵樹里面的節點該如何創建。LINQ Expression tree節點一般是通過System.Linq.Expression.Expression這個類上的工廠方法來創建的。包括以下的一些方法:
Add : BinaryExpression AddChecked : BinaryExpression And : BinaryExpression AndAlso : BinaryExpression ArrayIndex : BinaryExpression ArrayLength : UnaryExpression Call : MethodCallExpression Coalesce : BinaryExpression Condition : ConditionalExpression Constant : ConstantExpression Convert : UnaryExpression ConvertChecked : UnaryExpression Divide : BinaryExpression Equal : BinaryExpression ExclusiveOr : BinaryExpression Field : MemberExpression GreaterThan : BinaryExpression GreaterThanOrEqual : BinaryExpression Invoke : InvocationExpression Lambda : Expression<TDelegate> LeftShift : BinaryExpression LessThan : BinaryExpression LessThanOrEqual : BinaryExpression ListInit : ListInitExpression MakeBinary : BinaryExpression MakeMemberAccess : MemberExpression MakeUnary : UnaryExpression MemberInit : MemberInitExpression Modulo : BinaryExpression Multiply : BinaryExpression MultiplyChecked : BinaryExpression Negate : UnaryExpression NegateChecked : UnaryExpression New : NewExpression NewArrayBounds : NewArrayExpression NewArrayInit : NewArrayExpression Not : UnaryExpression NotEqual : BinaryExpression Or : BinaryExpression OrElse : BinaryExpression Parameter : ParameterExpression Power : BinaryExpression Property : MemberExpression PropertyOrField : MemberExpression Quote : UnaryExpression RightShift : BinaryExpression Subtract : BinaryExpression SubtractChecked : BinaryExpression TypeAs : UnaryExpression TypeIs : TypeBinaryExpression UnaryPlus : UnaryExpression
上述列表中每個名字其實對應著一組重載,參數不同,但返回值的類型是一樣的。這些工廠方法所生成的表達式的意義應該說還是很直觀的,就不特別介紹了。經常跟編譯器打交道的話應該對這些名字尤其熟悉。
這些工廠方法對應的類的層次結構是:
System.Object System.Linq.Expressions.Expression System.Linq.Expressions.BinaryExpression System.Linq.Expressions.ConditionalExpression System.Linq.Expressions.ConstantExpression System.Linq.Expressions.InvocationExpression System.Linq.Expressions.LambdaExpression System.Linq.Expressions.Expression<TDelegate> System.Linq.Expressions.MemberExpression System.Linq.Expressions.MethodCallExpression System.Linq.Expressions.NewExpression System.Linq.Expressions.NewArrayExpression System.Linq.Expressions.MemberInitExpression System.Linq.Expressions.ListInitExpression System.Linq.Expressions.ParameterExpression System.Linq.Expressions.TypeBinaryExpression System.Linq.Expressions.UnaryExpression
觀察可得知,LINQ Expression tree節點中的類只能用于表現表達式,而無法表現“更大”的語法結構,例如賦值表達式、一般語句等。這是LINQ v1的一個重要限制,也是為什么C# 3.0的規范里明確提到一個能賦值給Expressin<TDelegate>類型的lambda表達式的方法體只能是一個表達式,而不能是一個代碼塊——代碼塊無法通過LINQ v1里的Expression tree表示。同時也值得注意的是,LINQ Expression tree本質上是一棵靜態類型的樹——所有節點所表示的類型都能夠在編譯時確定。
以上是“如何創建LINQ Expression tree節點”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。