Expression.Quote
указывает, что лямбда должна рассматриваться как дерево выражения, а не как функция. Он индуцирует семантику закрытия для своего операнда.
Когда вы конструируете MethodCallExpression
с помощью Expression.Call
, любые параметры, которые являются лямбда-выражениями (_4 _ / _ 5_), должны использовать 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
?
Как указал Стивен, Expression.Quote
используется при реализации поставщиков запросов LINQ. Все методы на Queryable
, которые принимают лямбда-выражения, такие как Where
, OrderBy
, GroupBy
и т. Д., Внутренне создают MethodCallExpression
, используя Expression.Call
, и заключают параметры лямбда-выражения в Expression.Quote
вызовы.
Для более подробного объяснения Expression.Quote
прочтите этот ответ.
person
John Mills
schedule
02.10.2013
Func<>
, тогда убедитесь, что это все, что вам нужно, но в случае многих методов расширения LINQIQueryable<T>
тип параметра на самом делеExpression<Func<>>
, и в этом случае вам понадобитсяExpression.Quote
. Я не пробовал делать это с .NET 4.5, но предполагаю, что это было то же самое. На момент написания я, вероятно, использовал .NET 3.5. - person John Mills   schedule 03.10.2013