Condividi tramite


How to: Modify Expression Trees (Visual Basic) (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 dell'albero esistente e solo in seguito apportare le modifiche necessarie. È possibile usare la classe ExpressionVisitor per attraversare un albero delle espressioni esistente e copiare ogni nodo visitato.

Per modificare un albero delle espressioni

  1. Creare un nuovo progetto Applicazione console.

  2. Aggiungere un'istruzione Imports al file per lo spazio dei nomi System.Linq.Expressions.

  3. Aggiungere la classe AndAlsoModifier 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
    

    La classe eredita la classe ExpressionVisitor ed è specializzata per modificare le espressioni che rappresentano operazioni AND condizionali. Modifica tali operazioni da un'operazione AND condizionale a un'operazione OR condizionale. A tale scopo, la classe esegue l'override del metodo VisitBinary del tipo di base, perché le espressioni AND condizionali sono rappresentate come espressioni binarie. Se l'espressione che viene passata al metodo VisitBinary rappresenta un'operazione AND condizionale, il codice costruisce una nuova espressione che contiene l'operatore condizionale OR anziché l'operatore condizionale AND. Se l'espressione che viene passata a VisitBinary non rappresenta un'operazione AND condizionale, il metodo rimanda all'implementazione della classe base. I metodi della classe base costruiscono nodi uguali agli alberi delle espressione passati, ma i sottoalberi dei nodi vengono sostituiti con gli alberi delle espressioni che vengono generati in modo ricorsivo dal visitatore.

  4. Aggiungere un'istruzione Imports al file per lo spazio dei nomi System.Linq.Expressions.

  5. Aggiungere codice al metodo Main 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 AND condizionale. Viene quindi creata un'istanza della classe AndAlsoModifier e l'espressione viene passata al metodo Modify della classe. Sia l'albero delle espressioni originale che quello modificato vengono inclusi nell'output per illustrare le modifiche.

  6. Compilare l'applicazione ed eseguirla.

Vedi anche