Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 expressieboom wijzigen
Maak een nieuw consoletoepassingsproject .
Voeg een
Importsinstructie toe aan het bestand voor deSystem.Linq.Expressionsnaamruimte.Voeg de
AndAlsoModifierklasse 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 ClassDeze klasse neemt de ExpressionVisitor klasse over en is gespecialiseerd in het wijzigen van expressies die voorwaardelijke
ANDbewerkingen vertegenwoordigen. Deze bewerkingen worden gewijzigd van een voorwaardelijkANDin een voorwaardelijkOR. Hiervoor overschrijft de klasse de VisitBinary methode van het basistype, omdat voorwaardelijkeANDexpressies worden weergegeven als binaire expressies. Als in deVisitBinarymethode de expressie die aan de expressie wordt doorgegeven een voorwaardelijkeANDbewerking vertegenwoordigt, wordt met de code een nieuwe expressie gemaakt die de voorwaardelijkeORoperator bevat in plaats van de voorwaardelijkeANDoperator. Als de uitdrukking die aanVisitBinarywordt doorgegeven geen voorwaardelijkeANDbewerking vertegenwoordigt, schakelt de methode over naar 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
Importsinstructie toe aan het bestand voor deSystem.Linq.Expressionsnaamruimte.Voeg code toe aan de
Mainmethode 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
ANDbewerking bevat. Vervolgens wordt een exemplaar van deAndAlsoModifierklasse gemaakt en wordt de expressie doorgegeven aan deModifymethode 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.