Vorgehensweise: Ändern von Ausdrucksbaumstrukturen (C#)How to: Modify Expression Trees (C#)

In diesem Thema erfahren Sie, wie Sie eine Ausdrucksbaumstruktur ändern können.This topic shows you how to modify an expression tree. Ausdrucksbaumstrukturen sind unveränderlich, d.h. sie können nicht direkt modifiziert werden.Expression trees are immutable, which means that they cannot be modified directly. Um eine Ausdrucksbaumstruktur zu verändern, müssen Sie eine Kopie eines vorhandenen Ausdrucksbaumstruktur erstellen und währenddessen die erforderlichen Änderungen vornehmen.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. Sie können die ExpressionVisitor-Klasse verwenden, um einen vorhandenen Ausdrucksbaum zu durchlaufen und jeden Knoten zu kopieren, der durchlaufen wird.You can use the ExpressionVisitor class to traverse an existing expression tree and to copy each node that it visits.

So ändern Sie AusdrucksbaumstrukturenTo modify an expression tree

  1. Erstellen Sie ein neues Konsolenanwendungsprojekt.Create a new Console Application project.

  2. Fügen Sie der Datei eine using-Anweisung für den System.Linq.Expressions-Namespace hinzu.Add a using directive to the file for the System.Linq.Expressions namespace.

  3. Fügen Sie die AndAlsoModifier-Klasse in Ihr Projekt ein.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);  
        }  
    }  
    

    Diese Klasse erbt die ExpressionVisitor-Klasse und ist darauf spezialisiert, Ausdrücke zu verändern, die bedingte AND-Vorgänge darstellen.This class inherits the ExpressionVisitor class and is specialized to modify expressions that represent conditional AND operations. Es ändert diese Vorgänge von einem bedingten AND in ein bedingtes OR.It changes these operations from a conditional AND to a conditional OR. Zu diesem Zweck setzt die Klasse die VisitBinary-Methode der Basisklasse außer Kraft, weil bedingte AND-Ausdrücke als binäre Ausdrücke dargestellt werden.To do this, the class overrides the VisitBinary method of the base type, because conditional AND expressions are represented as binary expressions. Für die VisitBinary-Methode gilt Folgendes: Wenn der an die Methode übergebene Ausdruck eine bedingte AND-Operation darstellt, erstellt der Code einen neuen Ausdruck, der den bedingten Operator OR anstelle des bedingten Operators AND enthält.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. Wenn der an VisitBinary übergebene Ausdruck keinen bedingten AND-Vorgang darstellt, verzögert die Methode die Implementierung der Basisklasse.If the expression that is passed to VisitBinary does not represent a conditional AND operation, the method defers to the base class implementation. Die Basisklassenmethode erstellt Knoten, die den übergebenen Ausdrucksbaumstrukturen gleichen. In diesem Fall sind die Teilstrukturen der Knoten jedoch durch die Ausdrucksbaumstrukturen ersetzt, die vom Besucher rekursiv erstellt werden.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. Fügen Sie der Datei eine using-Anweisung für den System.Linq.Expressions-Namespace hinzu.Add a using directive to the file for the System.Linq.Expressions namespace.

  5. Fügen Sie der Main-Methode in der Datei „Program.cs“ Code hinzu, um eine Ausdrucksbaumstruktur zu erstellen, und übergeben Sie diese Struktur an die Methode, die sie ändert.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"))  
    */  
    

    Der Code erstellt einen Ausdruck, der einen bedingten AND-Vorgang enthält.The code creates an expression that contains a conditional AND operation. Er erstellt anschließend eine Instanz der AndAlsoModifier-Klasse und übergibt den Ausdruck an die Modify-Methode dieser Klasse.It then creates an instance of the AndAlsoModifier class and passes the expression to the Modify method of this class. Sowohl der ursprüngliche als auch der geänderte Ausdrucksbaum werden ausgegeben, um die Änderungen zu zeigen.Both the original and the modified expression trees are outputted to show the change.

  6. Kompilieren Sie die Anwendung, und führen Sie sie aus.Compile and run the application.

Siehe auchSee Also

Vorgehensweise: Ausführen von Ausdrucksbaumstrukturen (c#)How to: Execute Expression Trees (C#)
Ausdrucksbaumstrukturen (C#)Expression Trees (C#)