Sdílet prostřednictvím


Postupy: Úpravy stromů výrazů (C# a Visual Basic)

Toto téma popisuje, jak změnit ve stromu výraz.Výraz stromy jsou neměnné, což znamená, že je nelze změnit přímo.Chcete-li ve stromu výraz, musíte vytvořit kopii existující větvi výraz a při vytváření kopií, proveďte požadované změny.Můžete použít ExpressionVisitor třídy procházet existujícímu stromu výraz a zkopírujte každý uzel, který jej navštíví.

[!POZNÁMKA]

Zdrojový kód lze nalézt ExpressionVisitor třídy na CodePlex webu.

Změna ve stromu výraz

  1. V Visual Studio, vytvořte novou Aplikace konzoly projektu.

  2. Přidat AndAlsoModifier třídy do projektu.

    Tato třída dědí ExpressionVisitor třídy a specializovaný upravit výrazy, které představují podmíněné AND operací.Tyto operace změní z podmínka AND k podmínka OR.Tomto třída přepíše VisitBinary metoda základní typ protože podmíněné AND výrazy jsou reprezentovány jako binární výrazy.V VisitBinary metodu představuje výraz, který je předán podmíněné AND operace, kód vytvoří nový obsahující podmíněný výraz OR operátor namísto podmíněný AND operátor.Pokud výraz, který je předán do VisitBinary nepředstavuje podmínka AND operace, metoda odkládat údaje k provádění základní třídy.Metody základní třídy konstrukce uzly, které jsou jako výraz stromů, které jsou předávány, ale uzly mají jejich sub stromy nahrazen výrazem stromů, které jsou vyráběny podle návštěvníka rekurzivně.

    Přidat using směrnice (nebo Imports prohlášení v jazyce Visual Basic) souboru System.Linq.Expressions oboru názvů.

    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
    
    public class AndAlsoModifier : ExpressionVisitor
    {
        public Expression Modify(Expression expression)
        {
            return Visit(expression);
        }
    
        protected override Expression VisitBinary(BinaryExpression b)
        {
            if (b.NodeType == ExpressionType.AndAlso)
            {
                Expression left = this.Visit(b.Left);
                Expression right = this.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);
            }
    
            return base.VisitBinary(b);
        }
    }
    
  3. Přidat kód a Main v souboru Program.cs (Module1.vb v jazyce Visual Basic) vytvořit ve stromu výraz a předat jej metoda, metoda změní.

    Následující kód vytvoří výraz, který obsahuje podmínka AND operace.Poté vytvoří instanci AndAlsoModifier třídy a předává výraz Modify metody této třídy.Původní i změněné výraz stromy jsou výstupu zobrazit změny.

    Přidat using směrnice (nebo Imports prohlášení v jazyce Visual Basic) souboru System.Linq.Expressions oboru názvů.

    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"))
    
                Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");
                Console.WriteLine(expr);
    
                AndAlsoModifier treeModifier = new AndAlsoModifier();
                Expression modifiedExpr = treeModifier.Modify((Expression) expr);
    
                Console.WriteLine(modifiedExpr);
    
                /*  This code produces the following output:
    
                    name => ((name.Length > 10) && name.StartsWith("G"))
                    name => ((name.Length > 10) || name.StartsWith("G"))
                */
    
  4. Kompilace a spuštění aplikace.

Viz také

Úkoly

Postupy: Provádění stromů výrazů (C# a Visual Basic)

Koncepty

Stromy výrazů (C# a Visual Basic)