C#4.0:式ツリー対CodeDom

c# codedom expression-trees

質問

ExpressionツリーとCodeDomの違いは何ですか?どのシナリオに使うべきですか?

受け入れられた回答

エクスプレッションツリーには、 ASTなどの共通点があります。コードに直接マップするのではなく、アルゴリズムからの構築に非常に適しています。たとえば、数式を解析する場合は次のようになります。

((a + 2) / b)

あれは:

ParameterExpression a = ..., b = ...
var body = Expression.Divide(
    Expression.Add(a, Expression.Constant(2)),
    b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics

実際には、オブジェクトツリーを構築するパーサーを使用して、これを正確に実行しました。オブジェクトは、「ビジター」実装によって完全な表現を生成します。 .NET 4.0では、豊富な式ツリーのサポートにより、ほとんどのシナリオをサポートし、オンデマンドでコンパイルすることができます。

表現のもう1つの重要な使い方は、実行時にそれらを分解することができるということです。コードでは 、次のようなことがあります。

Foo(x => x.SomeMethod(1, "abc"));

SomeMethodメソッド情報、 1"abc"などを抽出する


コードはコードにマップされます 。それは、あなたが正規のコードを書く方法に非常によく似ています。コードムムの最も一般的な使用法は、ツールの一部としてのコード生成です。動的コンパイルに使用できますが、正直言ってそれは難しいです。私はファンではない。便利な機能は、のCodeDOMツリーが複数の言語のために働くかもしれないということです。


ここの別の候補は、 DynamicMethodおよび/またはILGeneratorでなければなりません。これ AST(式)にはマッピングされず、ソースコード(コード化)の生成には使用できませんが、MSILツールへのフルアクセスが可能です。もちろん、スタックなどの点で考える必要もありますが、メタプログラミングにとって非常に効率的で効果的です。


ILGeneratorがあまりにもハードコアで、codedomがPITAの場合、別のオプションはコードの実行時生成を文字列として行うことです。それをCSharpCodeProviderてコンパイルします。これを行うコアランタイムの一部( XmlSerializer IIRC)があります。


だから要約すると:

  • メタプログラミング: ILGeneratorまたはCSharpCodeProvider 。 4.0でのExpression (ただしこれは3.5でかなり制限されています)
  • AST処理: Expression
  • 実行時の解析: Expression
  • 複数言語でのコード生成:コードドーム

人気のある回答

式ツリーは式の構築に使用されます。実行時にソースコードを作成する。 CodeDomは、ソースコードをコンパイルするために使用されます。それはあなたがそれを構築する前に存在しなければなりません。式ツリーはより柔軟ですが、使用するのがずっと難しくなります。

アプリケーションにスクリプトを追加する場合は、CodeDomを使用します。非常に高度なリフレクションなどをしたい場合は、式ツリーを使用しますが、私はそれをお勧めしません。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ