Sdílet prostřednictvím


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 ExpressionVisitor můžete použít k procházení existujícího stromu výrazů a zkopírovat každý uzel, který procházíte.

Úprava stromu výrazů

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

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

  3. Přidejte třídu AndAlsoModifier do vašeho projektu.

    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 ExpressionVisitor a je specializovaná na úpravu výrazů, které představují podmíněné operace AND. 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 konstruují uzly, které se podobají předaným stromům výrazů, avšak uzly mají své dílčí stromy nahrazené stromy výrazů, které návštěvník vytváří rekurzivně.

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

  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 upravené stromy výrazů se zobrazují, aby ukázaly změnu.

  6. Zkompilujte a spusťte aplikaci.

Viz také