Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 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 atravessar uma árvore de expressão existente e copiar cada nó que ela visita.
Para modificar uma árvore de expressão
Crie um novo projeto de Aplicativo de Console .
Adicione uma instrução
Importsao arquivo para oSystem.Linq.Expressionsnamespace.Adicione a
AndAlsoModifierclasse 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 ClassEssa classe herda a ExpressionVisitor classe e é especializada para modificar expressões que representam operações condicionais
AND. Altera essas operações de uma condicionalANDpara uma condicionalOR. Para fazer isso, a classe substitui o VisitBinary método do tipo base, pois expressões condicionaisANDsão representadas como expressões binárias.VisitBinaryNo método, se a expressão passada para ela representar uma operação condicionalAND, o código construirá uma nova expressão que contenha o operador condicionalORem vez do operador condicionalAND. Se a expressão passada paraVisitBinarynão representar uma operação condicionalAND, o método recorrerá à implementação da classe básica. 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
Importsao arquivo para oSystem.Linq.Expressionsnamespace.Adicione código ao
Mainmétodo no arquivo Module1.vb para criar uma árvore de expressão e passá-la para o método que o 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 daAndAlsoModifierclasse e passa a expressão para oModifymétodo dessa classe. As árvores de expressão original e modificada são geradas para mostrar a alteração.Compile e execute o aplicativo.
Consulte também
- Como executar árvores de expressão (Visual Basic)
- árvores de expressão (Visual Basic)