Expression.Quote
ラムダが関数としてではなく式ツリーとして扱われることを指定します。オペランドにクロージャセマンティクスを誘導します。
MethodCallExpression
usingを作成する場合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.Quote
LINQクエリプロバイダーの実装に使用されます。、、、などのQueryable
ラムダ式を受け取るすべてのメソッドは、内部でusingを構築し、ラムダ式パラメーターを呼び出しでラップします。Where
OrderBy
GroupBy
MethodCallExpression
Expression.Call
Expression.Quote
の詳細な説明については、この回答Expression.Quote
をお読みください。