方法: 式ツリーを変更する (C#)How to: Modify Expression Trees (C#)

このトピックでは、式ツリーを変更する方法について説明します。This topic shows you how to modify an expression tree. 式ツリーは変更不可であるため、直接変更を加えることができません。Expression trees are immutable, which means that they cannot be modified directly. 式ツリーを変更するには、既存の式ツリーのコピーを作成する必要があります。コピーを作成する際に、必要な変更を加えます。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. ExpressionVisitor クラスを使用して、既存の式ツリーを走査し、走査した各ノードをコピーすることができます。You can use the ExpressionVisitor class to traverse an existing expression tree and to copy each node that it visits.

式ツリーを変更するにはTo modify an expression tree

  1. 新しいコンソール アプリケーション プロジェクトを作成します。Create a new Console Application project.

  2. ファイルに System.Linq.Expressions 名前空間の using ディレクティブを 追加します。Add a using directive to the file for the System.Linq.Expressions namespace.

  3. AndAlsoModifier クラスをプロジェクトに追加します。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);  
        }  
    }  
    

    このクラスは、AND 条件演算を表す式を変更するための特別なクラスで、ExpressionVisitor クラスを継承します。This class inherits the ExpressionVisitor class and is specialized to modify expressions that represent conditional AND operations. このクラスによって条件 AND が条件 OR に変更されます。It changes these operations from a conditional AND to a conditional OR. そのために、クラスは基本データ型の VisitBinary メソッドをオーバーライドします。AND 条件式は二項式で表されるためです。To do this, the class overrides the VisitBinary method of the base type, because conditional AND expressions are represented as binary expressions. VisitBinary メソッドでは、渡される式が AND 条件演算を表す場合、AND 条件演算子ではなく OR 条件演算子を含む新しい式がコードによって作成されます。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. VisitBinary に渡される式が AND 条件演算を表さない場合は、基底クラスの実装が延期されます。If the expression that is passed to VisitBinary does not represent a conditional AND operation, the method defers to the base class implementation. 基底クラスのメソッドによって、渡された式ツリーに似たノードが作成されますが、そのノードのサブツリーは、ビジターによって再帰的に作成される式ツリーに置き換えられます。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. ファイルに System.Linq.Expressions 名前空間の using ディレクティブを 追加します。Add a using directive to the file for the System.Linq.Expressions namespace.

  5. 式ツリーを作成し、それをメソッドに渡して変更するコードを、Program.cs ファイルの Main メソッドに追加します。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"))  
    */  
    

    次のコードは、AND 条件演算を含む式を作成し、The code creates an expression that contains a conditional AND operation. AndAlsoModifier クラスのインスタンスを作成して、このクラスの Modify メソッドにその式を渡します。It then creates an instance of the AndAlsoModifier class and passes the expression to the Modify method of this class. 元の式ツリーと変更された式ツリーの両方が出力され、変更内容が表示されます。Both the original and the modified expression trees are outputted to show the change.

  6. アプリケーションをコンパイルして実行します。Compile and run the application.

関連項目See Also

方法: 式ツリー (c#) を実行How to: Execute Expression Trees (C#)
式ツリー (C#)Expression Trees (C#)