Expression.Quote
indique qu'un lambda est d'être traité comme une expression de l'arbre et non pas en fonction. Il induit la fermeture de la sémantique sur son opérande.
Lorsque vous construisez un MethodCallExpression
l'aide Expression.Call
, tous les paramètres qui sont les expressions lambda (LambdaExpression
/Expression<TDelegate>
) doivent utiliser Expression.Quote
pour envelopper le paramètre avant de passer dans.
Donc, pour un paramètre de type Expression<Func<bool>>
, lorsque vous créez une instance telle que: () => true
, l'expression de l' Type
de la propriété serait Func<bool>
alors que l'expression du type (appelant GetType
) serait Expression<Func<bool>>
Donc, pour obtenir un Expression
qui a de la valeur correcte pour l' Type
de la propriété vous passez l'expression lambda en Expression.Quote
et que le paramètre Expression.Call
.
J'ai eu un coup d'oeil à l' Expression.Quote
grâce à réflecteur et alors que le seul paramètre est de type Expression
, elle doit dériver de LambdaExpression
et cela est vérifié à l'intérieur de la méthode. D'intérêt, quelqu'un sait pourquoi MS n'a pas seulement le type de paramètre être LambdaExpression
?
Comme StevenH souligné, Expression.Quote
est utilisé dans la mise en œuvre d'une Requête LINQ de Fournisseurs. Toutes les méthodes sur Queryable
qui prennent une expression lambda comme Where
, OrderBy
, GroupBy
, etc interne de la construction d'un MethodCallExpression
l'aide Expression.Call
et envelopper l'expression lambda paramètres avec Expression.Quote
des appels.
Pour une explication plus détaillée de l' Expression.Quote
lire cette réponse.