Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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
Importsau fichier de l'espace de nomsSystem.Linq.Expressions.Ajoutez la
AndAlsoModifierclasse à 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 ClassCette 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 conditionnellesANDsont représentées en tant qu’expressions binaires. Dans laVisitBinaryméthode, si l’expression passée à elle représente une opération conditionnelleAND, le code construit une nouvelle expression qui contient l’opérateur conditionnelORau lieu de l’opérateur conditionnelAND. Si l’expression passée àVisitBinaryne 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
Importsau fichier de l'espace de nomsSystem.Linq.Expressions.Ajoutez du code à la
Mainmé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 laAndAlsoModifierclasse et transmet l’expression à laModifymé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.