Condividi tramite


Procedura: Modificare alberi delle espressioni (Visual Basic)

In questo argomento viene illustrato come modificare un albero delle espressioni. Gli alberi delle espressioni non sono modificabili, il che significa che non possono essere modificati direttamente. Per modificare un albero delle espressioni, è necessario creare una copia di un albero delle espressioni esistente e, quando si crea la copia, apportare le modifiche necessarie. È possibile usare la ExpressionVisitor classe per attraversare un albero delle espressioni esistente e per copiare ogni nodo visitato.

Per modificare un albero delle espressioni

  1. Creare un nuovo progetto applicazione console .

  2. Aggiungere al file un'istruzione Imports per il namespace System.Linq.Expressions.

  3. Aggiungere la AndAlsoModifier classe al progetto.

    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
    

    Questa classe eredita la ExpressionVisitor classe ed è specializzata per modificare le espressioni che rappresentano operazioni condizionali AND . Cambia queste operazioni da un condizionale AND a un condizionale OR. A tale scopo, la classe esegue l'override del VisitBinary metodo del tipo di base, perché le espressioni condizionali AND sono rappresentate come espressioni binarie. VisitBinary Nel metodo , se l'espressione passata a essa rappresenta un'operazione condizionaleAND, il codice costruisce una nuova espressione che contiene l'operatore condizionale OR anziché l'operatore condizionaleAND. Se l'espressione passata a VisitBinary non rappresenta un'operazione condizionale, il metodo passa all'implementazione AND della classe di base. I metodi della classe base costruiscono nodi che sono simili agli alberi di espressioni passati come parametri, ma i nodi hanno i loro sottoalberi sostituiti con gli alberi di espressioni che il visitatore produce ricorsivamente.

  4. Aggiungere al file un'istruzione Imports per il namespace System.Linq.Expressions.

  5. Aggiungere codice al Main metodo nel file Module1.vb per creare un albero delle espressioni e passarlo al metodo che lo modificherà.

    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"))
    

    Il codice crea un'espressione che contiene un'operazione condizionale AND . Crea quindi un'istanza della AndAlsoModifier classe e passa l'espressione al Modify metodo di questa classe. Sia gli alberi delle espressioni originali che gli alberi delle espressioni modificati vengono restituiti per visualizzare la modifica.

  6. Compilare ed eseguire l'applicazione.

Vedere anche