How to: Modify Expression Trees (Visual Basic) (Vorgehensweise: Bearbeiten von Audrucksbaumstrukturen (Visual Basic))
In diesem Thema erfahren Sie, wie Sie eine Ausdrucksbaumstruktur ändern können. Ausdrucksbaumstrukturen sind unveränderlich, d.h. sie können nicht direkt modifiziert werden. Um eine Ausdrucksbaumstruktur zu verändern, müssen Sie eine Kopie eines vorhandenen Ausdrucksbaumstruktur erstellen und währenddessen die erforderlichen Änderungen vornehmen. Sie können die ExpressionVisitor-Klasse verwenden, um einen vorhandenen Ausdrucksbaum zu durchlaufen und jeden Knoten zu kopieren, der durchlaufen wird.
So ändern Sie Ausdrucksbaumstrukturen
Erstellen Sie ein neues Konsolenanwendungsprojekt.
Fügen Sie der Datei eine
Imports
Anweisung für denSystem.Linq.Expressions
Namespace hinzu.Fügen Sie die
AndAlsoModifier
-Klasse in Ihr Projekt ein.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 verändern, die bedingte
AND
-Vorgänge darstellen. Es ändert diese Vorgänge von einem bedingtenAND
in ein bedingtesOR
. Zu diesem Zweck setzt die Klasse die VisitBinary-Methode der Basisklasse außer Kraft, weil bedingteAND
-Ausdrücke als binäre Ausdrücke dargestellt werden. Für dieVisitBinary
-Methode gilt Folgendes: Wenn der an die Methode übergebene Ausdruck eine bedingteAND
-Operation darstellt, erstellt der Code einen neuen Ausdruck, der den bedingten OperatorOR
anstelle des bedingten OperatorsAND
enthält. Wenn der anVisitBinary
übergebene Ausdruck keinen bedingtenAND
-Vorgang darstellt, verzögert die Methode die Implementierung der Basisklasse. 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.Fügen Sie der Datei eine
Imports
Anweisung für denSystem.Linq.Expressions
Namespace hinzu.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. Er erstellt anschließend eine Instanz derAndAlsoModifier
-Klasse und übergibt den Ausdruck an dieModify
-Methode dieser Klasse. Sowohl der ursprüngliche als auch der geänderte Ausdrucksbaum werden ausgegeben, um die Änderungen zu zeigen.Kompilieren Sie die Anwendung, und führen Sie sie aus.