Come specificare il tipo di ritorno dell'albero delle espressioni?

c# expression-trees lambda

Domanda

Se costruisco manualmente un albero delle espressioni, il runtime sembra determinare automaticamente il tipo di ritorno. Quindi, se costruisco un albero di espressioni che assomiglia a questo:

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

il run-time sta determinando il tipo di reso come Cliente, essenzialmente questo:

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

Come posso costruirlo o cambiare ciò che ho creato, quindi il ritorno è oggetto, cioè l'espressione sarebbe:

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

Questo è generico e non so al momento della compilazione che il tipo di reso sarebbe Cliente; potrebbe essere qualsiasi proprietà di navigazione dall'ordine (in questo caso).

Una precisazione

Diciamo che inizio con un'espressione come questa:

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

Ho una routine che sta ricostruendo questo, cambiando il tipo di OrderDTO su Order camminando sull'albero e cambiando i tipi in base a una mappa di from / to types. Questo è tutto ciò che sto facendo, ma l'espressione risultante è

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

Quindi, quando ricostruisco la struttura, devo specificare il tipo restituito in qualche modo: sembra che il sistema stia determinando automaticamente il tipo di reso in quanto non l'ho specificato in ogni caso. Grazie, Ray

Risposta popolare

È difficile dire senza vedere il tuo codice, ma sembra che tu stia utilizzando le versioni di Expression.Lambda() che non ti permettono di specificare il tipo di espressione creata. Se lo fai, hai ragione che il tipo di delegato sarà deciso automaticamente.

Per risolvere questo problema, è necessario utilizzare una versione di Expression.Lambda() che consente di specificare il tipo di delegato utilizzando un parametro di tipo (ad esempio, Expression.Lambda<Func<Order, object>>(…) ) o, più probabile nel tuo caso, la versione in cui il tipo delegato è specificato come parametro normale di tipo Type ( Expression.Lambda(funcType, …) ).



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché