Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette rubrique vous montre comment modifier une arborescence d’expressions. Les arborescences d’expressions sont immuables, ce qui signifie qu’elles ne peuvent pas être modifiées directement. Pour modifier une arborescence d’expressions, vous devez créer une copie d’une arborescence d’expressions existante et lorsque vous créez la copie, apportez les modifications requises. Vous pouvez utiliser la ExpressionVisitor classe pour parcourir une arborescence d’expressions existante et copier chaque nœud qu’il visite.
Pour modifier une arborescence d’expressions
Créez un projet d’application console .
Ajoutez une instruction
Imports
au fichier de l'espace de nomsSystem.Linq.Expressions
.Ajoutez la
AndAlsoModifier
classe à votre projet.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
Cette classe hérite de la ExpressionVisitor classe et est spécialisée pour modifier des expressions qui représentent des opérations conditionnelles
AND
. Il modifie ces opérations d’un conditionnelAND
à un conditionnelOR
. Pour ce faire, la classe remplace la VisitBinary méthode du type de base, car les expressions conditionnellesAND
sont représentées en tant qu’expressions binaires. Dans laVisitBinary
méthode, si l’expression passée à elle représente une opération conditionnelleAND
, le code construit une nouvelle expression qui contient l’opérateur conditionnelOR
au lieu de l’opérateur conditionnelAND
. Si l’expression passée àVisitBinary
ne représente pas une opération conditionnelleAND
, la méthode reporte à l’implémentation de la classe de base. Les méthodes de la classe de base construisent des nœuds qui ressemblent aux arborescences d'expressions fournies en entrée, mais ces nœuds voient leurs sous-arborescences remplacées par les arborescences d'expressions produites de manière récursive par le visiteur.Ajoutez une instruction
Imports
au fichier de l'espace de nomsSystem.Linq.Expressions
.Ajoutez du code à la
Main
méthode dans le fichier Module1.vb pour créer une arborescence d’expressions et la transmettre à la méthode qui la modifiera.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"))
Le code crée une expression qui contient une opération conditionnelle
AND
. Il crée ensuite une instance de laAndAlsoModifier
classe et transmet l’expression à laModify
méthode de cette classe. Les arborescences d’expressions d’origine et modifiées sont générées pour afficher la modification.Compilez et exécutez l’application.