Umwandeln / Konvertieren von IEnumerableT in IEnumerableU?

8

Der folgende Befehl erfüllt jedoch zur Laufzeit eine Ausnahme. Was ich versuche zu tun, ist eine Klasse PersonWithAge in eine Klasse von Person zu werfen. Wie mache ich das und worum geht es bei der Arbeit?

%Vor%

BEARBEITEN: Übrigens wird PersonWithAge immer dieselben Eigenschaften wie Person plus ein paar mehr enthalten.

EDIT 2 Sorry Leute, aber ich hätte das etwas übersichtlicher machen sollen, sagen wir, ich habe zwei db Ansichten in einer Datenbank, die dieselben Spalten enthalten, aber die Ansicht 2 enthält 1 zusätzliches Feld. Meine Modellansichtselemente werden von einem Werkzeug generiert, das die Datenbankansichten imitiert. Ich habe eine MVC-Teilansicht, die von einer der Klassenentitäten erbt, aber ich habe mehr als eine Möglichkeit, Daten zu erfassen ...

Nicht sicher, ob das hilft, aber es bedeutet, dass ich personWithAge nicht von Person erben kann.

    
Rippo 21.11.2009, 16:45
quelle

6 Antworten

16

Sie können nicht casten, da sie unterschiedliche Typen sind. Sie haben zwei Möglichkeiten:

1) Ändern Sie die Klasse so, dass PersonWithAge von Person erbt.

%Vor%

2) Erstellen Sie neue Objekte:

%Vor%     
Mark Byers 21.11.2009, 16:48
quelle
6

Verwenden Sie Wählen Sie statt Cast , um anzugeben, wie die Konvertierung von einem Typ in einen anderen durchgeführt wird:

%Vor%

Auch wenn PersonWithAge immer die gleichen Eigenschaften wie Person plus ein paar mehr enthält, wäre es besser, wenn er von Person erbt.

    
Darin Dimitrov 21.11.2009 16:47
quelle
4

Sie können nicht einfach zwei nicht verwandte Typen ineinander werfen. Sie könnten die Umwandlung von PersonWithAge in Person ermöglichen, indem Sie PersonWithAge von Person erben lassen. Da PersonWithAge offensichtlich ein Sonderfall einer Person ist, macht dies viel Sinn:

%Vor%

Wenn Sie jetzt eine IEnumerable<PersonWithAge> namens personsWithAge haben, funktioniert personsWithAge.Cast<Person>() .

In VS 2010 können Sie den Cast sogar überspringen und (IEnumerable<Person>)personsWithAge ausführen, da IEnumerable<T> in .NET 4 kovariant ist.

    
Joren 21.11.2009 16:53
quelle
3

Erzeuge PersonWithAge von Person erben.

So:

%Vor%     
Michał Drozdowicz 21.11.2009 16:49
quelle
1

Vielleicht möchten Sie Ihren Code so ändern:

%Vor%     
John Boker 21.11.2009 16:48
quelle
1

Sie können IEnumerable<PersonWithAge> beibehalten und nicht in IEnumerable<Person> konvertieren. Fügen Sie einfach eine implizite Konvertierung hinzu, um ein Objekt von PersonWithAge in Person umzuwandeln, wenn Sie es brauchen.

%Vor% %Vor%     
Mehdi Golchin 21.11.2009 18:47
quelle

Tags und Links