Wie gibt man den Rückgabetyp der Ausdrucksbaumstruktur an?

c# expression-trees lambda

Frage

Wenn ich einen Ausdrucksbaum von Hand erstelle, scheint die Laufzeit automatisch den Rückgabetyp zu bestimmen. Also, wenn ich einen Ausdrucksbaum baue, der so aussieht:

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

Die Laufzeit bestimmt den Rückgabetyp als Kunde, im Wesentlichen:

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

Wie kann ich es bauen - oder ändern, was ich gebaut habe, also ist die Rückkehr ein Objekt, dh der Ausdruck wäre:

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

Dies ist generisch und ich weiß zur Kompilierzeit nicht, dass der Rückgabetyp Kunde sein würde; Es könnte jede Navigationsproperität von (in diesem Fall) Reihenfolge sein.

Klärung

Sagen wir, ich beginne mit einem solchen Ausdruck:

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

Ich habe eine Routine, die dies neu erstellt und den Typ von OrderDTO in Order OrderDTO , indem OrderDTO den Baum OrderDTO und die Typen basierend auf einer Karte von von / zu Typen OrderDTO . Das ist alles was ich mache, aber der daraus resultierende Ausdruck ist

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

Wenn ich also den Baum neu anlege, muss ich irgendwie den Rückgabetyp angeben - es sieht so aus, als ob das System den Rückgabetyp automatisch bestimmt, da ich es sowieso nicht angegeben habe. Danke, Ray

Beliebte Antwort

Es ist schwer zu sagen, ohne Ihren Code wirklich zu sehen, aber es sieht so aus, als ob Sie eine der Versionen von Expression.Lambda() , mit denen Sie den Typ des erstellten Ausdrucks nicht angeben können. Wenn Sie das tun, haben Sie Recht, dass der Delegattyp automatisch entschieden wird.

Um dies zu beheben, müssen Sie entweder eine Version von Expression.Lambda() , mit der Sie den Expression.Lambda<Func<Order, object>>(…) mit einem Typparameter angeben können (zB Expression.Lambda<Func<Order, object>>(…) ), oder Wahrscheinlicher ist in Ihrem Fall die Version, in der der Expression.Lambda(funcType, …) als normaler Parameter vom Typ Type ( Expression.Lambda(funcType, …) ) angegeben ist.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum