Compartir a través de


Cómo: Modificar árboles de expresión (Visual Basic)

En este tema se muestra cómo modificar un árbol de expresiones. Los árboles de expresión son inmutables, lo que significa que no se pueden modificar directamente. Para cambiar un árbol de expresión, debe crear una copia de un árbol de expresiones existente y, al crear la copia, realizar los cambios necesarios. Puede usar la ExpressionVisitor clase para recorrer un árbol de expresiones existente y copiar cada nodo que visita.

Para modificar un árbol de expresiones

  1. Cree un nuevo proyecto de aplicación de consola .

  2. Agregue una instrucción Imports al archivo para el espacio de nombres System.Linq.Expressions.

  3. Agregue la AndAlsoModifier clase al proyecto.

    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
    

    Esta clase hereda la ExpressionVisitor clase y está especializada en modificar expresiones que representan operaciones condicionales AND . Cambia estas operaciones de un condicional AND a un condicional OR. Para ello, la clase invalida el VisitBinary método del tipo base, ya que las expresiones condicionales AND se representan como expresiones binarias. En el VisitBinary método , si la expresión que se pasa a ella representa una operación condicional AND , el código construye una nueva expresión que contiene el operador condicional OR en lugar del operador condicional AND . Si la expresión que se pasa a VisitBinary no representa una operación condicional AND, el método se remite a la implementación de la clase base. Los métodos de clase base construyen nodos que son como los árboles de expresiones que se pasan, pero los subárboles de los nodos se reemplazan por los árboles de expresiones que genera de forma recursiva el visitante.

  4. Agregue una instrucción Imports al archivo para el espacio de nombres System.Linq.Expressions.

  5. Agregue código al Main método en el archivo Module1.vb para crear un árbol de expresiones y pasarlo al método que lo modificará.

    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"))
    

    El código crea una expresión que contiene una operación condicional AND . A continuación, crea una instancia de la AndAlsoModifier clase y pasa la expresión al Modify método de esta clase. Tanto los árboles de expresión originales como los modificados se generan para mostrar el cambio.

  6. Compile y ejecute la aplicación.

Consulte también