LINQ Expression tree節(jié)點
在向大家詳細介紹創(chuàng)建LINQ Expression tree節(jié)點之前,首先讓大家了解下節(jié)點該如何創(chuàng)建,然后全面介紹。
創(chuàng)建LINQ Expression tree節(jié)點
當(dāng)了解LINQ Expression tree的概念后,就可以來討論一下這棵樹里面的節(jié)點該如何創(chuàng)建。LINQ Expression tree節(jié)點一般是通過System.Linq.Expression.Expression這個類上的工廠方法來創(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
上述列表中每個名字其實對應(yīng)著一組重載,參數(shù)不同,但返回值的類型是一樣的。這些工廠方法所生成的表達式的意義應(yīng)該說還是很直觀的,就不特別介紹了。經(jīng)常跟編譯器打交道的話應(yīng)該對這些名字尤其熟悉。
這些工廠方法對應(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é)點中的類只能用于表現(xiàn)表達式,而無法表現(xiàn)“更大”的語法結(jié)構(gòu),例如賦值表達式、一般語句等。這是LINQ v1的一個重要限制,也是為什么C# 3.0的規(guī)范里明確提到一個能賦值給Expressin<TDelegate>類型的lambda表達式的方法體只能是一個表達式,而不能是一個代碼塊——代碼塊無法通過LINQ v1里的Expression tree表示。同時也值得注意的是,LINQ Expression tree本質(zhì)上是一棵靜態(tài)類型的樹——所有節(jié)點所表示的類型都能夠在編譯時確定。
【編輯推薦】