Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
Creare un nuovo progetto applicazione console .
Aggiungere al file un'istruzione
Imports
per il namespaceSystem.Linq.Expressions
.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 condizionaleAND
a un condizionaleOR
. A tale scopo, la classe esegue l'override del VisitBinary metodo del tipo di base, perché le espressioni condizionaliAND
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 condizionaleOR
anziché l'operatore condizionaleAND
. Se l'espressione passata aVisitBinary
non rappresenta un'operazione condizionale, il metodo passa all'implementazioneAND
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.Aggiungere al file un'istruzione
Imports
per il namespaceSystem.Linq.Expressions
.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 dellaAndAlsoModifier
classe e passa l'espressione alModify
metodo di questa classe. Sia gli alberi delle espressioni originali che gli alberi delle espressioni modificati vengono restituiti per visualizzare la modifica.Compilare ed eseguire l'applicazione.