Procedure: Expressiestructuren wijzigen (Visual Basic)
In dit onderwerp wordt beschreven hoe u een expressiestructuur wijzigt. Expressiestructuren zijn onveranderbaar, wat betekent dat ze niet rechtstreeks kunnen worden gewijzigd. Als u een expressiestructuur wilt wijzigen, moet u een kopie van een bestaande expressiestructuur maken en de vereiste wijzigingen aanbrengen wanneer u de kopie maakt. U kunt de ExpressionVisitor klasse gebruiken om een bestaande expressiestructuur te doorlopen en elk knooppunt te kopiƫren dat wordt bezocht.
Een expressiestructuur wijzigen
Maak een nieuw consoletoepassingsproject .
Voeg een
Imports
instructie toe aan het bestand voor deSystem.Linq.Expressions
naamruimte.Voeg de
AndAlsoModifier
klasse toe aan uw project.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
Deze klasse neemt de ExpressionVisitor klasse over en is gespecialiseerd in het wijzigen van expressies die voorwaardelijke
AND
bewerkingen vertegenwoordigen. Deze bewerkingen worden gewijzigd van een voorwaardelijkAND
in een voorwaardelijkOR
. Hiervoor overschrijft de klasse de VisitBinary methode van het basistype, omdat voorwaardelijkeAND
expressies worden weergegeven als binaire expressies. Als in deVisitBinary
methode de expressie die aan de expressie wordt doorgegeven een voorwaardelijkeAND
bewerking vertegenwoordigt, wordt met de code een nieuwe expressie gemaakt die de voorwaardelijkeOR
operator bevat in plaats van de voorwaardelijkeAND
operator. Als de expressie waaraan wordt doorgegevenVisitBinary
geen voorwaardelijkeAND
bewerking vertegenwoordigt, wordt de methode uitgesteld tot de implementatie van de basisklasse. De basisklassemethoden maken knooppunten die lijken op de expressiestructuren die worden doorgegeven, maar de knooppunten hebben hun substructuren vervangen door de expressiestructuren die recursief door de bezoeker worden geproduceerd.Voeg een
Imports
instructie toe aan het bestand voor deSystem.Linq.Expressions
naamruimte.Voeg code toe aan de
Main
methode in het Module1.vb-bestand om een expressiestructuur te maken en door te geven aan de methode waarmee deze wordt gewijzigd.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"))
Met de code wordt een expressie gemaakt die een voorwaardelijke
AND
bewerking bevat. Vervolgens wordt een exemplaar van deAndAlsoModifier
klasse gemaakt en wordt de expressie doorgegeven aan deModify
methode van deze klasse. Zowel de oorspronkelijke als de gewijzigde expressiestructuren worden uitgevoerd om de wijziging weer te geven.Compileer de toepassing en voer deze uit.