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