Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Erstellen Sie ein neues Konsolenanwendungsprojekt .
Fügen Sie der Datei eine
ImportsAnweisung für denSystem.Linq.ExpressionsNamespace hinzu.Fügen Sie die
AndAlsoModifierKlasse 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 ClassDiese Klasse erbt die ExpressionVisitor Klasse und ist darauf spezialisiert, Ausdrücke zu ändern, die bedingte
ANDVorgänge darstellen. Sie verändert diese Vorgänge von einer bedingtenANDzu einer bedingtenOR. Dazu überschreibt die Klasse die VisitBinary Methode des Basistyps, da bedingteANDAusdrücke als binäre Ausdrücke dargestellt werden. In derVisitBinary-Methode, wenn der Ausdruck, der an sie übergeben wird, einen bedingtenAND-Vorgang darstellt, erstellt der Code einen neuen Ausdruck, der den bedingtenOR-Operator anstelle des bedingtenAND-Operators enthält. Wenn der Ausdruck, der anVisitBinaryübergeben wird, keinen bedingtenANDVorgang 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.Fügen Sie der Datei eine
ImportsAnweisung für denSystem.Linq.ExpressionsNamespace 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
ANDVorgang enthält. Anschließend wird eine Instanz derAndAlsoModifierKlasse erstellt und der Ausdruck an dieModifyMethode dieser Klasse übergeben. Sowohl der ursprüngliche als auch der geänderte Ausdrucksbaum werden ausgegeben, um die Veränderung anzuzeigen.Kompilieren Sie die Anwendung, und führen Sie sie aus.