Laden...

Object to List<T>-Cast

Erstellt von Umpalumpa vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.235 Views
U
Umpalumpa Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren
Object to List<T>-Cast

Hallo!

Nach meinem Wissensstand sollte doch eigentlich jede Klasse irgendwie mit der Klasse "Object" verwandt sein. Und es stellt normalerweise kein Problem dar ein Objekt einer abgeleiteten Klasse in eines der Vorfahren zu konvertieren.
Warum funktioniert aber folgende Zeile nicht:


List<string> list = (List<string>)(new object());

?

Hintergedanke:
Ich wollte mir eine Methode schreiben, in der ich generisch Listeninhalte erzuegen kann, was auch bei eindimensionalen Listen kein Problem darstellt, bei mehrdimensionalen schon. (siehe Codeschnippsel)

Hat jemand eine Idee?

Ich danke euch für eure Hilfe! 😃

Grüße

5.742 Beiträge seit 2007
vor 12 Jahren

Hallo Umpalumpa,

Nach meinem Wissensstand sollte doch eigentlich jede Klasse irgendwie mit der Klasse "Object" verwandt sein. Und es stellt normalerweise kein Problem dar ein Objekt einer abgeleiteten Klasse in eines der Vorfahren zu konvertieren.

Ja, das schon.
In deinem Beispiel machst du das aber genau anders herum: Du erzeugst ein Object und willst es in eine seiner Unterklassen konvertieren - das klappt natürlich nicht.

Das geht nur, wenn das Objekt, das du konvertierst, auch tatsächlich ein Objekt dieser Unterklase (bzw. eines einer weiteren Unterklasse) ist.

Vermutlich suchst du Reflection bzw. im Speziellen die Methode Activator.CreateInstance in Verbindung mit typeof(List<>).MakeGenericType.

G
538 Beiträge seit 2008
vor 12 Jahren

new object() war nie eine Liste und kann viel weniger als deine Liste - also warum solltest du den Cast machen dürfen?

Andersrum würde gehen, also

object o = (object)new List<T>();

und mehrdimensionale Listen kann man mit List<List<T>> machen.
Wenn du Keys brauchst, dann Dictionary<Key<Dictonary<Key, Value>>.

Oft lohnt es sich dann entsprechende Klassen zu erstellen, die einen sprechenderen Namen haben.

Hinweis von herbivore vor 12 Jahren

Andersrum würde gehen

sogar ohne Cast, also

object o = new List<T>();

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

U
Umpalumpa Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Der Denkfehler ist mir auch grad beim weiteren Testen klar geworden. ^^

@winSharp93
Die Reflections werd ich mir mal anschauen. Danke!

@Grumbler85
Mehrdimensionale Listen erzeugen ist nicht das Problem, nur gebe ich als Parameter eine n-dimensionale Liste an die Methode, und es sollen dann weitere leere Elemente hinzugefügt werden.
Ich könnte jetzt anfangen für n Dimensionen Methoden zu schreiben, was aber nicht praktikabel wäre, da dann vielleicht eine für die n+1te Dimension benötigt wird. Daher wollte ich es gerne schön generisch in einer regeln.

R
1 Beiträge seit 2011
vor 12 Jahren

Sie müssen über eine "Boxing und Unboxing" lesen.
Das bedeutet,dass bevor Sie unboxing können, Sie müssen ein List zu object einwickeln.

Beispiel:


List<string> list;// = (List<string>)(new object());//Fails

object boxedListObject = new List<string>();
list = (List<string>) (boxedListObject);

Vergessen Sie einige Tricks nicht.


 double e = 2.718281828459045;
 object o = e; // box
 int ee = (int)o; // runtime exception

zuerst wir müssen die double ((double)o) auspacken.
Danach Sie können die 'double' in eine int auspacken.

Hinweis von herbivore vor 12 Jahren

Bevor wir jetzt erneut in das Boxing-Thema einsteigen, sei auf Boxing/Unboxing: Es wird in Büchern immer erwähnt, aber welchen Vorteil bringt es mit sich? verweisen.