Guide pratique pour modifier des arborescences d’expressions (Visual Basic)
Cette rubrique 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 changer une arborescence d’expressions, vous devez créer une copie d’une arborescence d’expressions existante et, quand vous créez la copie, apporter les modifications nécessaires. Vous pouvez utiliser la classe ExpressionVisitor pour parcourir une arborescence d’expressions existante et copier chaque nœud visité.
Pour modifier une arborescence d’expressions
Créez un projet Application console.
Ajoutez une
Imports
instruction au fichier de l’System.Linq.Expressions
espace de noms.Ajoutez la classe
AndAlsoModifier
à 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 classe
AND
et est spécialisée pour modifier les expressions qui représentent des opérations ExpressionVisitor conditionnelles. Elle convertit ces opérations d’unAND
conditionnel en unOR
conditionnel. Pour ce faire, la classe substitue la méthode VisitBinary du type de base, car les expressionsAND
conditionnelles sont représentées sous forme d’expressions binaires. Dans la méthodeVisitBinary
, si l’expression passée représente une opérationAND
conditionnelle, le code construit une nouvelle expression qui contient l’opérateurOR
conditionnel au lieu de l’opérateurAND
conditionnel. Si l’expression passée àVisitBinary
ne représente pas une opérationAND
conditionnelle, la méthode emploie l’implémentation de classe de base. Les méthodes de classe de base construisent des nœuds qui sont comme les arborescences d’expressions passées, mais les nœuds voient leurs sous-arborescences remplacées par les arborescences d’expressions produites de manière récursive par le visiteur.Ajoutez une
Imports
instruction au fichier de l’System.Linq.Expressions
espace de noms.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
AND
conditionnelle. Il crée ensuite une instance de la classeAndAlsoModifier
et passe l’expression à la méthodeModify
de cette classe. Les arborescences d’expressions d’origine et modifiée sont toutes deux générées pour montrer la modification.Compilez et exécutez l'application.