Comment spécifier le type de retour de l'arbre d'expression?

c# expression-trees lambda

Question

Si je construis un arbre d'expression à la main, l'exécution semble déterminer automatiquement le type de retour. Donc, si je construis un arbre d'expression qui ressemble à ceci:

// Order contains a navigation property for Customer
(Order o) => o.Customer;

l'exécution détermine le type de retour en tant que client, essentiellement ceci:

Expression<Func<Order, Customer>> efd = (Order o) => o.Customer;

Comment puis-je le construire - ou changer ce que j'ai construit, de sorte que le retour soit objet, c'est-à-dire que l'expression serait:

Expression<Func<Order, object>> ef = (Order o) => o.Customer;

Ceci est générique et je ne sais pas au moment de la compilation que le type de retour serait Client; cela pourrait être n'importe quelle propriété de navigation de (dans ce cas) l'ordre.

Clarification

Disons que je commence par une expression comme celle-ci:

Expression<Func<OrderDTO, object>> ef = (OrderDTO o) => o.Customer;

J'ai une routine qui reconstruit ceci, en changeant le type de OrderDTO en Order en parcourant l'arbre et en modifiant les types en fonction d'une carte de types de / à. C'est tout ce que je fais, mais l'expression résultante est

Expression<Func<Order, Customer>> ef = (Order o) => o.Customer;

Ainsi, lorsque je reconstruis l'arborescence, j'ai besoin de spécifier le type de retour. Il semble que le système détermine automatiquement le type de retour comme je ne l'ai pas spécifié de toute façon. Merci Ray

Réponse populaire

Il est difficile de dire sans voir votre code, mais il semble que vous utilisiez l'une des versions de Expression.Lambda() qui ne vous permettait pas de spécifier le type de l'expression créée. Si vous faites cela, vous avez raison de dire que le type de délégué sera choisi automatiquement.

Pour résoudre ce problème, vous devez utiliser une version de Expression.Lambda() qui vous permet de spécifier le type de délégué à l'aide d'un paramètre de type (par exemple, Expression.Lambda<Func<Order, object>>(…) ), ou plus vraisemblablement dans votre cas, la version où le type de délégué est spécifié en tant que paramètre normal de type Type ( Expression.Lambda(funcType, …) ).



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow