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

このトピックでは、式ツリーを実行する方法について説明します。This topic shows you how to execute an expression tree. 式ツリーを実行すると値が返される場合がありますが、メソッドの呼び出しなどの処理が実行されるだけの場合もあります。Executing an expression tree may return a value, or it may just perform an action such as calling a method.

実行できるのは、ラムダ式を表す式ツリーのみです。Only expression trees that represent lambda expressions can be executed. ラムダ式を表す式ツリーの型は、LambdaExpression または Expression<TDelegate> です。Expression trees that represent lambda expressions are of type LambdaExpression or Expression<TDelegate>. このような式ツリーを実行するには、Compile メソッドを呼び出して実行可能なデリゲートを作成した後、そのデリゲートを呼び出します。To execute these expression trees, call the Compile method to create an executable delegate, and then invoke the delegate.

注意

デリゲートの型が不明な場合、つまり、ラムダ式が LambdaExpression 型であり Expression<TDelegate> 型ではない場合には、デリゲートを直接呼び出さずに、デリゲートに対して DynamicInvoke メソッドを呼び出す必要があります。If the type of the delegate is not known, that is, the lambda expression is of type LambdaExpression and not Expression<TDelegate>, you must call the DynamicInvoke method on the delegate instead of invoking it directly.

式ツリーがラムダ式を表さない場合、Lambda<TDelegate>(Expression, IEnumerable<ParameterExpression>) メソッドを呼び出すことで、元の式ツリーを本体に含む新しいラムダ式を作成できます。If an expression tree does not represent a lambda expression, you can create a new lambda expression that has the original expression tree as its body, by calling the Lambda<TDelegate>(Expression, IEnumerable<ParameterExpression>) method. その後、このセクションの説明のとおりにラムダ式を実行できます。Then, you can execute the lambda expression as described earlier in this section.

Example

次のコード例は、ラムダ式を作成して実行することで数値の累乗を表す式ツリーの実行方法を示しています。The following code example demonstrates how to execute an expression tree that represents raising a number to a power by creating a lambda expression and executing it. このコードを実行すると、累乗された数値を表す結果が表示されます。The result, which represents the number raised to the power, is displayed.

// The expression tree to execute.  
BinaryExpression be = Expression.Power(Expression.Constant(2D), Expression.Constant(3D));  

// Create a lambda expression.  
Expression<Func<double>> le = Expression.Lambda<Func<double>>(be);  

// Compile the lambda expression.  
Func<double> compiledExpression = le.Compile();  

// Execute the lambda expression.  
double result = compiledExpression();  

// Display the result.  
Console.WriteLine(result);  

// This code produces the following output:  
// 8  

コードのコンパイルCompiling the Code

  • System.Core.dll がまだ参照されていない場合は、System.Core.dll へのプロジェクト参照を追加します。Add a project reference to System.Core.dll if it is not already referenced.

  • System.Linq.Expressions 名前空間をインクルードします。Include the System.Linq.Expressions namespace.

関連項目See Also

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