Question

Les états de documentation MSDN:

  

Expression.Quote

     

méthode crée un   UnaryExpression qui représente un   expression qui a une valeur constante   Type de Expression.

J'ai été en mesure de construire des expressions de prédicats pour une utilisation dans les requêtes LINQ manuellement par les construire en utilisant la classe d'expression, mais n'a jamais rencontré la nécessité d'Expression.Quote.

Quand et pourquoi utiliseriez-vous cela? Des expressions LINQ je l'ai vu qui les ont, ils semblent envelopper expressions existantes sans ajouter de la valeur.

Quel est le but de la méthode de soumission / type de noeud?

Était-ce utile?

La solution

Expression.Quote spécifie qu'un lambda doit être traité comme un arbre d'expression et non en fonction. Il induit la sémantique de fermeture sur son opérande.

Lorsque vous construisez un MethodCallExpression en utilisant Expression.Call, tous les paramètres qui sont des expressions lambda (LambdaExpression / Expression<TDelegate>) doit 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, la propriété Type de l'expression serait Func<bool> alors que le type de l'expression (appelant la GetType) serait Expression<Func<bool>>

Donc, pour obtenir une Expression qui a la valeur correcte pour la propriété Type vous passez l'expression lambda dans Expression.Quote et passer que le paramètre à Expression.Call.

J'ai eu un coup d'œil à travers Expression.Quote réflecteur et alors que le seul paramètre est de type Expression, il doit provenir de LambdaExpression et cette case est cochée dans la méthode. Par intérêt, quelqu'un sait pourquoi MS n'a pas seulement fait le type de paramètre soit LambdaExpression?

Comme StevenH a souligné, Expression.Quote est utilisé dans la mise en œuvre des fournisseurs de requête LINQ. Toutes les méthodes sur Queryable qui prennent une expression lambda tels que Where, OrderBy, GroupBy, etc construire en interne un MethodCallExpression en utilisant Expression.Call et envelopper les paramètres d'expression lambda avec des appels Expression.Quote.

Pour une explication plus détaillée de Expression.Quote lire cette réponse .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top