Expression.Quote
указывает, что лямбда должна рассматриваться как дерево выражений, а не как функция. Он вызывает семантику замыкания в своем операнде.
Когда вы создаете MethodCallExpression
с использованием 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
?
Как указал Стивен, Expression.Quote
используется при реализации поставщиков запросов LINQ. Все методы в Queryable
, которые принимают лямбда-выражения, такие как Where
, OrderBy
, GroupBy
и т. Д., Внутренне создают MethodCallExpression
, используя Expression.Call
, и обертывают параметры лямбда-выражения вызовами Expression.Quote
.
Для более подробного объяснения Expression.Quote
прочитайте этот ответ .