Expression<> は C# で正確に何に使用されますか? Expression<> 自身をオブジェクトとしてインスタンス化するシナリオはありますか? もしそうなら、例を挙げてください!
ありがとうございました!
Expression<> は C# で正確に何に使用されますか? Expression<> 自身をオブジェクトとしてインスタンス化するシナリオはありますか? もしそうなら、例を挙げてください!
ありがとうございました!
Expression<T>
ほぼ完全に LINQ に使用されますが、そうである必要はありません。LINQ 内では、通常、コードで表現されたロジックを "キャプチャ" するために使用されますが、データには保持されます。そのデータは、LINQ プロバイダーによって検査され、適切に処理されます (たとえば、SQL に変換するなど)。通常、LINQ の式ツリーは、ラムダ式またはクエリ式からコンパイラによって作成されますが、それ以外の場合は、API を自分で直接使用すると便利です。
私がそれを使用し、使用されているのを見た他の場所のいくつかの例:
long
、予想よりもトリッキーです)。ulong
LINQ に関して言えば、純粋にラムダ式で作成するよりも、実行時により用途の広い LINQ クエリを作成するために実行できることがあります。
私は、ILExpression
の代わりとして、マイクロコンパイラとして何度も使用してきました。DynamicMethod
このアプローチは .NET 4.0 で ( InfoQ で議論されているように) 強化されていますが、3.5 でもできることはたくさんあります (通常は実行時データに基づいて、構成など):
また、Microsoft で行った作業の数学エンジンの一部としても使用しました。つまり、数式 ("(x + 12) * y = z" など) をExpression
ツリーに解析し、コンパイルして実行します。
もう 1 つの興味深い用途 (Jason Bock による説明、こちら) は遺伝的プログラミングです。候補をツリーとして構築するExpression
と、それらをすばやく実行するために必要なコードが得られますが (後でCompile()
)、重要なことに (遺伝的プログラミングの場合)、フラグメントを交換することもできます。
別の SO question への回答で、前後のコードを見てください。
概要:Expression<>
コードを大幅に簡素化し、理解しやすくし、幻のバグを修正しました。