Expression.Quote
especifica que una lambda debe tratarse como un árbol de expresiones y no como una función. Induce la semántica de cierre en su operando.
Cuando usted está construyendo una MethodCallExpression
usando Expression.Call
, cualquier parámetro que son expresiones lambda (LambdaExpression
/Expression<TDelegate>
) debe utilizar Expression.Quote
para envolver el parámetro antes de pasar en.
Así que para un parámetro de tipo Expression<Func<bool>>
, cuando se crea un caso como: () => true
, la propiedad de la expresión Type
sería Func<bool>
mientras que el tipo de la expresión (llamando GetType
) sería Expression<Func<bool>>
Así que para obtener un Expression
que tiene el valor correcto para la propiedad Type
pasa la expresión lambda a Expression.Quote
y pasa eso como el parámetro a Expression.Call
.
Eché un vistazo a Expression.Quote
a través del reflector y mientras el único parámetro es del tipo Expression
, debe derivar de LambdaExpression
y esto se comprueba dentro del método. Sin interés, ¿alguien sabe por qué MS no hizo simplemente que el tipo de parámetro sea LambdaExpression
?
Como StevenH señaló, Expression.Quote
se usa para implementar proveedores de consultas LINQ. Todos los métodos en Queryable
que toman una expresión lambda como Where
, OrderBy
, GroupBy
, etc. construyen internamente un MethodCallExpression
usando Expression.Call
y envuelven los parámetros de expresión lambda con Expression.Quote
llamadas.
Para una explicación más detallada de Expression.Quote
lea esto answer.
"Cuando está construyendo un MethodCallExpression utilizando Expression.Call, los parámetros que son expresiones lambda (LambdaExpression/Expression) deben usar Expression.Quote para ajustar el parámetro antes de pasar". ¿Es eso cierto? Usando .Net 4.5, puedo pasar satisfactoriamente la Expresión > sin necesidad de citarlas primero con Expression.Quote(). –
Si su parámetro es de tipo 'Func <>', entonces seguro que es todo lo que necesita, pero en el caso de muchos métodos de extensión LINQ 'IQueryable', el tipo de parámetro es realmente 'Expresión >', y en ese caso necesitarás 'Expression.Quote'. No he intentado hacer esto con .NET 4.5, pero supongo que fue lo mismo. En el momento de escribir, probablemente estaba usando .NET 3.5. –
GiddyUpHorsey