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
Creare un nuovo progetto Applicazione console.
Aggiungere un'istruzione
Imports
al file per lo spazio dei nomiSystem.Linq.Expressions
.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'operazioneAND
condizionale a un'operazioneOR
condizionale. A tale scopo, la classe esegue l'override del metodo VisitBinary del tipo di base, perché le espressioniAND
condizionali sono rappresentate come espressioni binarie. Se l'espressione che viene passata al metodoVisitBinary
rappresenta un'operazioneAND
condizionale, il codice costruisce una nuova espressione che contiene l'operatore condizionaleOR
anziché l'operatore condizionaleAND
. Se l'espressione che viene passata aVisitBinary
non rappresenta un'operazioneAND
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.Aggiungere un'istruzione
Imports
al file per lo spazio dei nomiSystem.Linq.Expressions
.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 classeAndAlsoModifier
e l'espressione viene passata al metodoModify
della classe. Sia l'albero delle espressioni originale che quello modificato vengono inclusi nell'output per illustrare le modifiche.Compilare l'applicazione ed eseguirla.
Vedi anche
- How to: Execute Expression Trees (Visual Basic) (Procedura: Eseguire alberi delle espressioni (Visual Basic))
- Alberi delle espressioni (Visual Basic)