10

Expression<> は C# で正確に何に使用されますか? Expression<> 自身をオブジェクトとしてインスタンス化するシナリオはありますか? もしそうなら、例を挙げてください!

ありがとうございました!

4

3 に答える 3

8

Expression<T>ほぼ完全に LINQ に使用されますが、そうである必要はありませ。LINQ 内では、通常、コードで表現されたロジックを "キャプチャ" するために使用されますが、データには保持されます。そのデータは、LINQ プロバイダーによって検査され、適切に処理されます (たとえば、SQL に変換するなど)。通常、LINQ の式ツリーは、ラムダ式またはクエリ式からコンパイラによって作成されますが、それ以外の場合は、API を自分で直接使用すると便利です。

私がそれを使用し、使用されているのを見た他の場所のいくつかの例:

  • MiscUtilでは、Marc Gravell がこれを使用して「汎用算術演算」を実装しました。型に関連する演算子がある場合は、汎用的に使用できます。
  • UnconstrainedMelodyでは、基になる型に関係なく、同様の方法でフラグ列挙型に対して操作を実行するために使用しました (範囲が異なるためlong、予想よりもトリッキーです)。ulong
  • Visual LINQでは、クエリ式を使用して LINQ を "アニメーション化" したので、何が起こっているかがわかります。これは明らかに LINQ の使用法ですが、ロジックを別の形式に変換する従来の形式ではありません。
于 2009-09-15T06:09:04.467 に答える
4

LINQ に関して言えば、純粋にラムダ式で作成するよりも、実行時により用途の広い LINQ クエリを作成するために実行できることがあります。

私は、ILExpressionの代わりとして、マイクロコンパイラとして何度も使用してきました。DynamicMethodこのアプローチは .NET 4.0 で ( InfoQ で議論されているように) 強化されていますが、3.5 でもできることはたくさんあります (通常は実行時データに基づいて、構成など):

また、Microsoft で行った作業の数学エンジンの一部としても使用しました。つまり、数式 ("(x + 12) * y = z" など) をExpressionツリーに解析し、コンパイルして実行します。

もう 1 つの興味深い用途 (Jason Bock による説明、こちら) は遺伝的プログラミングです。候補をツリーとして構築するExpressionと、それらをすばやく実行するために必要なコードが得られますが (後でCompile())、重要なことに (遺伝的プログラミングの場合)、フラグメントを交換することもできます。

于 2009-09-15T06:40:02.110 に答える
0

別の SO question への回答で、前後のコードを見てください。

概要:Expression<>コードを大幅に簡素化し、理解しやすくし、幻のバグを修正しました。

于 2009-09-15T05:32:27.333 に答える