溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何創(chuàng)建LINQ Expression tree節(jié)點(diǎn)

發(fā)布時(shí)間:2021-12-01 16:51:30 來源:億速云 閱讀:173 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下如何創(chuàng)建LINQ Expression tree節(jié)點(diǎn),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

創(chuàng)建LINQ Expression tree節(jié)點(diǎn)

當(dāng)了解LINQ Expression tree的概念后,就可以來討論一下這棵樹里面的節(jié)點(diǎn)該如何創(chuàng)建。LINQ Expression tree節(jié)點(diǎn)一般是通過System.Linq.Expression.Expression這個(gè)類上的工廠方法來創(chuàng)建的。包括以下的一些方法:

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

上述列表中每個(gè)名字其實(shí)對(duì)應(yīng)著一組重載,參數(shù)不同,但返回值的類型是一樣的。這些工廠方法所生成的表達(dá)式的意義應(yīng)該說還是很直觀的,就不特別介紹了。經(jīng)常跟編譯器打交道的話應(yīng)該對(duì)這些名字尤其熟悉。

這些工廠方法對(duì)應(yīng)的類的層次結(jié)構(gòu)是:

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節(jié)點(diǎn)中的類只能用于表現(xiàn)表達(dá)式,而無法表現(xiàn)“更大”的語(yǔ)法結(jié)構(gòu),例如賦值表達(dá)式、一般語(yǔ)句等。這是LINQ v1的一個(gè)重要限制,也是為什么C# 3.0的規(guī)范里明確提到一個(gè)能賦值給Expressin<TDelegate>類型的lambda表達(dá)式的方法體只能是一個(gè)表達(dá)式,而不能是一個(gè)代碼塊——代碼塊無法通過LINQ v1里的Expression tree表示。同時(shí)也值得注意的是,LINQ Expression tree本質(zhì)上是一棵靜態(tài)類型的樹——所有節(jié)點(diǎn)所表示的類型都能夠在編譯時(shí)確定。

以上是“如何創(chuàng)建LINQ Expression tree節(jié)點(diǎn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)
AI