式ツリーは、単一の式の構文ツリーを表します。
ツリーの各ノードは、何らかの定数、オブジェクト メンバー参照、または操作を表します。
たとえば、2 + 3
構築できる式と式ツリーの場合:
Expression.MakeBinary(
ExpressionType.Add,
Expression.Constant(2),
Expression.Constant(3));
このようなツリーの中で最も重要なのは Expression です。これにより、TDelegate に一致する署名のラムダ関数を思い起こさせる読みやすい形式で式を記述できます。元はこちら
Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?
ただし、式は直接実行できないため、デリゲートではありません。
代わりに、たとえばビジター オブジェクトを使用してトラバースし、実行可能な表現を構築することができます。例としては、Expression.Compile() を使用したデリゲート ビルドや、CompiledQuery.Compile() などを使用して LINQ クエリから構築された SQL クエリがあります。
式ツリーのもう 1 つの便利なアプリケーションは、リフレクションの使用を必要とするオブジェクトのメンバーを表すためにそれらを使用することです。リフレクションは文字列を使用してメンバー名を表し、コンパイル時にチェックを行いません。式ツリーがチェックされるため、エラーが少し少なくなる可能性があります。
PropertyInfo prop1 = typeof(MyClass).GetProperty("Value");
Expression<Func<MyClass, int>> expr = mc => mc.Value;
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo;