Porady: modyfikowanie drzew wyrażeń (C#)How to: Modify Expression Trees (C#)

W tym temacie przedstawiono sposób modyfikowania drzewo wyrażenia.This topic shows you how to modify an expression tree. Drzewa wyrażeń są niezmienne, co oznacza, że nie można ich modyfikować bezpośrednio.Expression trees are immutable, which means that they cannot be modified directly. Aby zmienić drzewo wyrażenia, należy utworzyć kopię istniejącej drzewo wyrażeń i podczas tworzenia kopii, wprowadź wymagane zmiany.To change an expression tree, you must create a copy of an existing expression tree and when you create the copy, make the required changes. Można użyć ExpressionVisitor klasy przechodzenia przez drzewo wyrażeń istniejących i skopiować na każdym węźle, który go odwiedza.You can use the ExpressionVisitor class to traverse an existing expression tree and to copy each node that it visits.

Aby zmodyfikować drzewa wyrażeńTo modify an expression tree

  1. Utwórz nową aplikacji konsoli projektu.Create a new Console Application project.

  2. Dodaj using dyrektywy w pliku System.Linq.Expressions przestrzeni nazw.Add a using directive to the file for the System.Linq.Expressions namespace.

  3. Dodaj AndAlsoModifier klasy do projektu.Add the AndAlsoModifier class to your project.

    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);  
        }  
    }  
    

    Ta klasa dziedziczy ExpressionVisitor klasy i jest przeznaczone do modyfikowania wyrażeń, które reprezentują warunkowego AND operacji.This class inherits the ExpressionVisitor class and is specialized to modify expressions that represent conditional AND operations. Zmienia te operacje z warunkowego AND Conditional OR.It changes these operations from a conditional AND to a conditional OR. W tym celu przesłonięć klasy VisitBinary metody typu podstawowego, ponieważ warunkowego AND wyrażenia są reprezentowane jako wyrażenia binarne.To do this, the class overrides the VisitBinary method of the base type, because conditional AND expressions are represented as binary expressions. W VisitBinary metody, jeśli wyrażenie, które jest przekazywane do niego reprezentuje warunkowego AND operacji, kod tworzy nowe wyrażenie, które zawiera warunkowe OR operator zamiast warunkowe AND operator.In the VisitBinary method, if the expression that is passed to it represents a conditional AND operation, the code constructs a new expression that contains the conditional OR operator instead of the conditional AND operator. Jeśli wyrażenie, które są przekazywane do VisitBinary nie reprezentuje warunkowego AND operacji, metoda różni się do implementacji klasy podstawowej.If the expression that is passed to VisitBinary does not represent a conditional AND operation, the method defers to the base class implementation. Metody klasy podstawowej konstrukcja węzłów, które są podobne do drzewa wyrażeń, które są przekazywane w, ale węzły mają ich drzew sub zastąpione drzewa wyrażeń, które są produkowane rekursywnie przez obiekt odwiedzający.The base class methods construct nodes that are like the expression trees that are passed in, but the nodes have their sub trees replaced with the expression trees that are produced recursively by the visitor.

  4. Dodaj using dyrektywy w pliku System.Linq.Expressions przestrzeni nazw.Add a using directive to the file for the System.Linq.Expressions namespace.

  5. Dodaj kod, aby Main metody w pliku Program.cs Utwórz drzewo wyrażeń i przekazać go do metody który zmodyfikuje go.Add code to the Main method in the Program.cs file to create an expression tree and pass it to the method that will modify it.

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

    Kod tworzy wyrażenia zawierającego warunkowego AND operacji.The code creates an expression that contains a conditional AND operation. Następnie tworzy wystąpienie AndAlsoModifier klasy i przekazuje wyrażenie Modify metody tej klasy.It then creates an instance of the AndAlsoModifier class and passes the expression to the Modify method of this class. Zarówno oryginalnej i drzew wyrażeń zmodyfikowane są wyjściowych, aby pokazać zmiany.Both the original and the modified expression trees are outputted to show the change.

  6. Kompilowanie i uruchamianie aplikacji.Compile and run the application.

Zobacz teżSee Also

Porady: wykonywanie drzew wyrażeń (C#)How to: Execute Expression Trees (C#)
Drzewa wyrażeń (C#)Expression Trees (C#)