Postupy: Úprava stromů výrazů (Visual Basic)

V tomto tématu se dozvíte, jak upravit strom výrazů. Stromy výrazů jsou neměnné, což znamená, že je nelze přímo upravit. Pokud chcete změnit strom výrazů, musíte vytvořit kopii existujícího stromu výrazu a při vytváření kopie provést požadované změny. Třídu můžete použít ExpressionVisitor k procházení existujícího stromu výrazů a ke zkopírování každého uzlu, který navštíví.

Úprava stromu výrazů

  1. Vytvořte nový projekt konzolové aplikace .

  2. Přidejte do souboru pro System.Linq.Expressions obor názvů příkazImports.

  3. Přidejte do AndAlsoModifier projektu třídu.

    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
    

    Tato třída dědí třídu a je specializovaná na úpravu ExpressionVisitor výrazů, které představují podmíněné AND operace. Tyto operace se změní z podmíněného AND na podmíněný OR. K tomu třída přepíše VisitBinary metodu základního typu, protože podmíněné AND výrazy jsou reprezentovány jako binární výrazy. VisitBinary Pokud výraz předaný do této metody představuje podmíněnou AND operaci, kód vytvoří nový výraz, který obsahuje podmíněný OR operátor namísto podmíněného AND operátoru. Pokud výraz, který je předán VisitBinary , nepředstavuje podmíněnou AND operaci, metoda deferuje na implementaci základní třídy. Metody základní třídy vytvářejí uzly, které jsou podobné stromům výrazů, které jsou předány, ale uzly mají jejich dílčí stromy nahrazené stromy výrazů, které jsou vytvářeny rekurzivně návštěvníkem.

  4. Přidejte do souboru pro System.Linq.Expressions obor názvů příkazImports.

  5. Do metody v souboru Module1.vb přidejte kód Main , který vytvoří strom výrazu a předá ho metodě, která ji upraví.

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

    Kód vytvoří výraz, který obsahuje podmíněnou AND operaci. Pak vytvoří instanci AndAlsoModifier třídy a předá výraz Modify metodě této třídy. Původní i změněné stromy výrazů se zobrazí tak, aby se změna zobrazila.

  6. Zkompilujte a spusťte aplikaci.

Viz také