47

MSDNのドキュメントには次のように記載されています。

Expression.Quote

メソッドExpression型の定数値を持つ式を表すUnaryExpressionを作成します。

Expressionクラスを使用して手動で述語式を作成することにより、LINQクエリで使用する述語式を作成できましたが、Expression.Quoteの必要性に遭遇したことはありません。

いつ、なぜこれを使用しますか?それらを持っている私が見たLINQ式から、それらは値を追加せずに既存の式をラップしているように見えます。

Quoteメソッド/ノードタイプの目的は何ですか?

4

1 に答える 1

31

Expression.Quoteラムダが関数としてではなく式ツリーとして扱われることを指定します。オペランドにクロージャセマンティクスを誘導します。

MethodCallExpressionusingを作成する場合Expression.Call、ラムダ式(LambdaExpression/ Expression<TDelegate>Expression.Quoteであるパラメーターは、渡す前にパラメーターをラップするために使用する必要があります。

したがって、タイプのパラメータのExpression<Func<bool>>場合、次のようなインスタンスを作成する() => trueと、式のTypeプロパティは次のようになりますFunc<bool>が、式のタイプ(呼び出しGetType)は次のようになります。Expression<Func<bool>>

したがってExpression、プロパティの正しい値を持つを取得するにはType、ラムダ式をExpression.Quoteに渡し、それをパラメーターとしてに渡しますExpression.Call

スルーリフレクターを確認しましExpression.Quoteた。唯一のパラメーターはタイプですがExpression、から派生する必要がLambdaExpressionあり、これはメソッド内でチェックされます。興味深いことに、MSがパラメータタイプを単に作成しなかった理由を誰もが知っていますLambdaExpressionか?

StevenHが指摘したように、Expression.QuoteLINQクエリプロバイダーの実装に使用されます。、、、などのQueryableラムダ式を受け取るすべてのメソッドは、内部でusingを構築し、ラムダ式パラメーターを呼び出しでラップします。WhereOrderByGroupByMethodCallExpressionExpression.CallExpression.Quote

の詳細な説明については、この回答Expression.Quoteをお読みください。

于 2013-10-02T22:43:03.750 に答える