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 drzewa 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żesz użyć ExpressionVisitor klasy Przenoszenie istniejących drzewa wyrażeń i skopiuj każdy węzeł, który go wizyty.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ą aplikację Konsolową 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 do warunkowego OR.It changes these operations from a conditional AND to a conditional OR. Aby to zrobić, przesłonięć klasy VisitBinary metody typu podstawowego, ponieważ warunkowego AND wyrażenia są reprezentowane jako wyrażenia binarnego.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óry jest przekazywany do niego reprezentuje warunkowe AND operacji, kod tworzy nowe wyrażenie, które zawiera warunkową OR operator zamiast warunkową 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 warunkowe AND operacja, metoda odracza 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 bazowej, węzły konstrukcji, które są podobne do drzew wyrażeń, które są przekazywane w, ale węzły mają ich drzew podrzędnych zastąpione drzew wyrażeń, które są generowane cyklicznie 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, aby utworzyć drzewo wyrażeń i przekazać go do metody, będzie go zmodyfikować.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"))  
    */  
    

    Ten kod tworzy wyrażenia zawierającego warunkowe AND operacji.The code creates an expression that contains a conditional AND operation. Następnie tworzy wystąpienie AndAlsoModifier klasy i przekazuje wyrażenia do 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 oryginał, jak i drzewa wyrażeń zmodyfikowane są zwrócone do wyświetlenia zmiany.Both the original and the modified expression trees are outputted to show the change.

  6. Skompilować i uruchomić aplikację.Compile and run the application.

Zobacz teżSee Also