¿Cómo especificar el tipo de retorno del árbol de expresión?

c# expression-trees lambda

Pregunta

Si construyo un árbol de expresiones a mano, el tiempo de ejecución parece determinar automáticamente el tipo de retorno. Así que si construyo un árbol de expresiones que se ve así:

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

el tiempo de ejecución es determinar el tipo de devolución como Cliente, esencialmente esto:

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

¿Cómo puedo construirlo o cambiar lo que construí, por lo que el retorno es un objeto, es decir, la expresión sería:

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

Esto es genérico y no sé en el momento de la compilación que el tipo de devolución sea Cliente; Podría ser cualquier propiedad de navegación de (en este caso) orden.

Aclaración

Digamos que empiezo con una expresión como esta:

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

Tengo una rutina que está reconstruyendo esto, cambiando el tipo de OrderDTO a Order al recorrer el árbol y cambiando los tipos basados ​​en un mapa de desde / a tipos. Eso es todo lo que estoy haciendo, pero la expresión resultante es

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

Entonces, cuando reconstruyo el árbol, necesito especificar el tipo de retorno de alguna manera, parece que el sistema está determinando automáticamente el tipo de retorno ya que no lo especifiqué. Gracias ray

Respuesta popular

Es difícil decirlo sin ver realmente su código, pero parece que está usando una de las versiones de Expression.Lambda() que no le permiten especificar el tipo de expresión creada. Si lo haces, tienes razón en que el tipo de delegado se decidirá automáticamente.

Para solucionar este problema, debe usar una versión de Expression.Lambda() que le permita especificar el tipo de delegado usando un parámetro de tipo (por ejemplo, Expression.Lambda<Func<Order, object>>(…) ), o más probable en su caso, la versión en la que se especifica el tipo de delegado como un parámetro normal de tipo Type ( Expression.Lambda(funcType, …) ).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow