如何:修改運算式樹狀結構 (Visual Basic)
本主題示範如何修改運算式樹狀架構。 運算式樹狀架構為不可變,這表示無法直接對其進行修改。 若要變更運算式樹狀架構,您必須建立現有運算式樹狀架構的複本,並且在建立複本時進行必要的變更。 您可以使用 ExpressionVisitor 類別周遊現有的運算式樹狀架構,並複製每個瀏覽的節點。
修改運算式樹狀架構
建立新的主控台應用程式專案。
將
Imports
陳述式新增至System.Linq.Expressions
命名空間的檔案。將
AndAlsoModifier
類別新增至專案。Public Class AndAlsoModifier Inherits ExpressionVisitor Public Function Modify(ByVal expr As Expression) As Expression Return Visit(expr) End Function Protected Overrides Function VisitBinary(ByVal b As BinaryExpression) As Expression If b.NodeType = ExpressionType.AndAlso Then Dim left = Me.Visit(b.Left) Dim right = Me.Visit(b.Right) ' Make this binary expression an OrElse operation instead ' of an AndAlso operation. Return Expression.MakeBinary(ExpressionType.OrElse, left, right, _ b.IsLiftedToNull, b.Method) End If Return MyBase.VisitBinary(b) End Function End Class
此類別會繼承 ExpressionVisitor 類別,並針對代表
AND
條件運算的運算式進行修改。 它會將這些運算從AND
條件運算變更為OR
條件運算。 為了執行這項操作,此類別會覆寫基底類型的 VisitBinary 方法,因為AND
條件運算式會以二元運算式來表示。 在VisitBinary
方法中,如果傳遞給它的運算式代表AND
條件運算,程式碼會建構新的運算式,以包含OR
條件運算子來取代AND
條件運算子。 如果傳遞給VisitBinary
的運算式不代表AND
條件運算,此方法會延後到基底類別實作。 基底類別方法會建構類似傳入之運算式樹狀架構的節點,但這些節點的樹狀子目錄會由造訪者以遞迴方式產生的運算式樹狀架構來取代。將
Imports
陳述式新增至System.Linq.Expressions
命名空間的檔案。將程式碼新增至 Module1.vb 檔案中的
Main
方法以建立運算式樹狀架構,然後將運算式樹狀架構傳遞給要修改其內容的方法。Dim expr As Expression(Of Func(Of String, Boolean)) = _ Function(name) name.Length > 10 AndAlso name.StartsWith("G") Console.WriteLine(expr) Dim modifier As New AndAlsoModifier() Dim modifiedExpr = modifier.Modify(CType(expr, Expression)) Console.WriteLine(modifiedExpr) ' This code produces the following output: ' name => ((name.Length > 10) && name.StartsWith("G")) ' name => ((name.Length > 10) || name.StartsWith("G"))
此程式碼會建立包含
AND
條件運算的運算式。 然後建立AndAlsoModifier
類別的執行個體,並將運算式傳遞給此類別的Modify
的方法。 此時會輸出原始和修改後的運算式樹狀架構,以顯示變更的情形。編譯並執行應用程式。