Freigeben über


Wie man: Ausdrucksbäume ändert (Visual Basic)

In diesem Thema erfahren Sie, wie Sie einen Ausdrucksbaum ändern. Ausdrucksstrukturen sind unveränderlich, was bedeutet, dass sie nicht direkt geändert werden können. Zum Ändern einer Ausdrucksstruktur müssen Sie eine Kopie einer vorhandenen Ausdrucksstruktur erstellen und beim Erstellen der Kopie die erforderlichen Änderungen vornehmen. Sie können die ExpressionVisitor Klasse verwenden, um eine vorhandene Ausdrucksstruktur zu durchlaufen und jeden von ihr besuchten Knoten zu kopieren.

So ändern Sie einen Ausdrucksbaum

  1. Erstellen Sie ein neues Konsolenanwendungsprojekt .

  2. Fügen Sie der Datei eine Imports Anweisung für den System.Linq.Expressions Namespace hinzu.

  3. Fügen Sie die AndAlsoModifier Klasse zu Ihrem Projekt hinzu.

    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
    

    Diese Klasse erbt die ExpressionVisitor Klasse und ist darauf spezialisiert, Ausdrücke zu ändern, die bedingte AND Vorgänge darstellen. Sie verändert diese Vorgänge von einer bedingten AND zu einer bedingten OR. Dazu überschreibt die Klasse die VisitBinary Methode des Basistyps, da bedingte AND Ausdrücke als binäre Ausdrücke dargestellt werden. In der VisitBinary-Methode, wenn der Ausdruck, der an sie übergeben wird, einen bedingten AND-Vorgang darstellt, erstellt der Code einen neuen Ausdruck, der den bedingten OR-Operator anstelle des bedingten AND-Operators enthält. Wenn der Ausdruck, der an VisitBinary übergeben wird, keinen bedingten AND Vorgang darstellt, verweist die Methode auf die Basisklassenimplementierung. Die Basisklassenmethode erstellt Knoten, die den übergebenen Ausdrucksbaumstrukturen gleichen. In diesem Fall sind die Teilstrukturen der Knoten jedoch durch die Ausdrucksbaumstrukturen ersetzt, die vom Besucher rekursiv erstellt werden.

  4. Fügen Sie der Datei eine Imports Anweisung für den System.Linq.Expressions Namespace hinzu.

  5. Fügen Sie der Main-Methode in der Datei Module1.vb hinzu, um eine Ausdrucksbaumstruktur zu erstellen, und übergeben Sie diese Struktur an die Methode, die sie ändert.

    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"))
    

    Der Code erstellt einen Ausdruck, der einen bedingten AND Vorgang enthält. Anschließend wird eine Instanz der AndAlsoModifier Klasse erstellt und der Ausdruck an die Modify Methode dieser Klasse übergeben. Sowohl der ursprüngliche als auch der geänderte Ausdrucksbaum werden ausgegeben, um die Veränderung anzuzeigen.

  6. Kompilieren Sie die Anwendung, und führen Sie sie aus.

Siehe auch