Partager via


Guide pratique pour modifier des arborescences d’expressions (Visual Basic)

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

  1. Créez un projet d’application console .

  2. Ajoutez une instruction Imports au fichier de l'espace de noms System.Linq.Expressions.

  3. 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 conditionnel AND à un conditionnel OR. Pour ce faire, la classe remplace la VisitBinary méthode du type de base, car les expressions conditionnelles AND sont représentées en tant qu’expressions binaires. Dans la VisitBinary méthode, si l’expression passée à elle représente une opération conditionnelle AND , le code construit une nouvelle expression qui contient l’opérateur conditionnel OR au lieu de l’opérateur conditionnel AND . Si l’expression passée à VisitBinary ne représente pas une opération conditionnelle AND , 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.

  4. Ajoutez une instruction Imports au fichier de l'espace de noms System.Linq.Expressions.

  5. 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 la AndAlsoModifier classe et transmet l’expression à la Modify méthode de cette classe. Les arborescences d’expressions d’origine et modifiées sont générées pour afficher la modification.

  6. Compilez et exécutez l’application.

Voir aussi