Delen via


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

  1. Maak een nieuw consoletoepassingsproject .

  2. Voeg een Imports instructie toe aan het bestand voor de System.Linq.Expressions naamruimte.

  3. 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 voorwaardelijk AND in een voorwaardelijk OR. Hiervoor overschrijft de klasse de VisitBinary methode van het basistype, omdat voorwaardelijke AND expressies worden weergegeven als binaire expressies. Als in de VisitBinary methode de expressie die aan de expressie wordt doorgegeven een voorwaardelijke AND bewerking vertegenwoordigt, wordt met de code een nieuwe expressie gemaakt die de voorwaardelijke OR operator bevat in plaats van de voorwaardelijke AND operator. Als de expressie waaraan wordt doorgegeven VisitBinary geen voorwaardelijke AND 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.

  4. Voeg een Imports instructie toe aan het bestand voor de System.Linq.Expressions naamruimte.

  5. 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 de AndAlsoModifier klasse gemaakt en wordt de expressie doorgegeven aan de Modify methode van deze klasse. Zowel de oorspronkelijke als de gewijzigde expressiestructuren worden uitgevoerd om de wijziging weer te geven.

  6. Compileer de toepassing en voer deze uit.

Zie ook