Como modificar árvores de expressão (Visual Basic)
Este tópico mostra como modificar uma árvore de expressão. As árvores de expressão são imutáveis, o que significa que não podem ser modificadas diretamente. Para alterar uma árvore de expressão, você deve criar uma cópia de uma árvore de expressão existente e, ao criar a cópia, fazer as alterações necessárias. Você pode usar a ExpressionVisitor classe para percorrer uma árvore de expressão existente e copiar cada nó que ela visita.
Para modificar uma árvore de expressões
Crie um novo projeto de Aplicativo de Console .
Adicione uma
Imports
instrução ao arquivo para oSystem.Linq.Expressions
namespace.Adicione a
AndAlsoModifier
classe ao seu projeto.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
Essa classe herda a ExpressionVisitor classe e é especializada para modificar expressões que representam operações condicionais
AND
. Ele altera essas operações de uma condicionalAND
para uma condicionalOR
. Para fazer isso, a classe substitui o VisitBinary método do tipo base, porque expressões condicionaisAND
são representadas como expressões binárias.VisitBinary
No método, se a expressão que é passada para ele representa uma operação condicionalAND
, o código constrói uma nova expressão que contém o operador condicionalOR
em vez do operador condicionalAND
. Se a expressão que é passada paraVisitBinary
não representa uma operação condicionalAND
, o método adia para a implementação da classe base. Os métodos de classe base constroem nós que são como as árvores de expressão que são passadas, mas os nós têm suas subárvores substituídas pelas árvores de expressão que são produzidas recursivamente pelo visitante.Adicione uma
Imports
instrução ao arquivo para oSystem.Linq.Expressions
namespace.Adicione código ao
Main
método no arquivo Module1.vb para criar uma árvore de expressão e passá-la para o método que a 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"))
O código cria uma expressão que contém uma operação condicional
AND
. Em seguida, ele cria uma instância daAndAlsoModifier
classe e passa a expressão para oModify
método dessa classe. As árvores de expressão original e modificada são saídas para mostrar a alteração.Compile e execute o aplicativo.