共用方式為


如何:修改運算式樹 (Visual Basic)

本主題說明如何修改表達式樹狀結構。 表達式樹狀架構不可變,這表示無法直接修改它們。 若要變更表達式樹狀結構,您必須建立現有表達式樹狀結構的複本,並在建立複本時進行必要的變更。 您可以使用 類別 ExpressionVisitor 來周遊現有的表達式樹狀結構,並複製它流覽的每個節點。

修改表達式樹

  1. 建立新的 主控台應用程式 專案。

  2. 新增一個 Imports 語句至 System.Linq.Expressions 命名空間的檔案。

  3. 將類別 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 式作業,則方法會延遲至基類實作。 基類方法會建構類似傳入之表達式樹狀架構的節點,但是節點的子樹狀結構已由訪客以遞歸方式產生的表達式樹狀結構取代。

  4. 新增一個 Imports 語句至 System.Linq.Expressions 命名空間的檔案。

  5. 將程式代碼新增至 Main Module1.vb 檔案中的 方法,以建立表達式樹狀結構,並將它傳遞給將修改它的方法。

    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方法。 系統會輸出原始和修改過的運算式樹狀結構,以顯示變更。

  6. 編譯並執行應用程式。

另請參閱