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 elas não podem ser diretamente modificadas. 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, faça as alterações necessárias. Você pode usar a classe ExpressionVisitor para percorrer uma árvore de expressão existente e copiar cada nó que ela visitar.
Para modificar uma árvore de expressão
Crie um novo projeto de Aplicativo de Console.
Adicione uma instrução
Imports
ao arquivo para o namespaceSystem.Linq.Expressions
.Adicione a classe
AndAlsoModifier
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 classe ExpressionVisitor e é especializada para modificar expressões que representam operações
AND
condicionais. Ela muda essas operações de umaAND
condicional para umaOR
condicional. Para fazer isso, a classe substitui o método VisitBinary do tipo base, pois as expressõesAND
condicionais são representadas como expressões binárias. No métodoVisitBinary
, se a expressão que é passada a ele representa uma operaçãoAND
condicional, o código cria uma nova expressão que contém o operadorOR
condicional em vez do operadorAND
condicional. Se a expressão que é passada para oVisitBinary
não representa uma operaçãoAND
condicional, o método adia para a implementação da classe base. Os métodos da classe base constroem nós que são semelhantes às á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 instrução
Imports
ao arquivo para o namespaceSystem.Linq.Expressions
.Adicione código para o método
Main
no arquivo Module1.vb para criar uma árvore de expressão e passá-la ao 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
AND
condicional. Em seguida, ele cria uma instância da classeAndAlsoModifier
e passa a expressão ao métodoModify
dessa classe. A árvore de expressão original e a modificada são geradas para mostrar a alteração.Compile e execute o aplicativo.