Umwandlung einer generischen Liste in eine Klasse, die von einer Liste abgeleitet ist

7

Ich habe eine von List abgeleitete Klasse erstellt. Wenn ich jedoch versuchte, die Klasse in ein anderes List-Objekt umzuwandeln, erhalte ich einen Laufzeitfehler. Mein Code ist dem folgenden ähnlich:

%Vor%

Ich hoffe, dass mir jemand dabei helfen kann. Danke.

    
Chris Gold 04.07.2010, 16:11
quelle

4 Antworten

12

Warum würdest du erwarten, dass du in der Lage bist zu wirken? Das Objekt ist nicht eine Instanz von CategoryObjCollection . Der Referenzpunkttyp-Umwandlungsvorgang (wenn er tatsächlich statt expliziter Konvertierungen ausführt) besteht darin, dem Compiler mitzuteilen, dass der Typ Ausführungszeit des Objekts tatsächlich mit dem von Ihnen angegebenen Typ kompatibel ist. damit Sie Mitglieder dieses spezifischen Typs (nach dem Ausführungszeittest) verwenden können. In diesem Fall erstellt die ToList -Erweiterungsmethode nur eine neue List<T> .

Genauer gesagt, was ist Ihr CategoryObjCollection -Typ eigentlich? Wenn es einen anderen Status als die normale Liste gibt, wo würden Sie nach der LINQ-Abfrage von diesem Status erwartet? Wenn es keinen anderen Zustand hat, fügt es wirklich irgendeinen Nutzen hinzu? Vielleicht sollte Ihr Typ eigentlich eine Liste enthalten und nicht von ihr ableiten? Dann könnten Sie mit den Ergebnissen der Abfrage eine neue Instanz des Typs erstellen.

Im Allgemeinen ist es normalerweise ein Designgeruch, der von List<T> abgeleitet wird. Es bietet nicht viele Möglichkeiten, seine "Listenhaftigkeit" zu spezialisieren (anders als etwa Collection<T> ). Es ist normalerweise ein Zeichen, dass Sie an die Zusammensetzung statt an die Vererbung denken sollten.

    
Jon Skeet 04.07.2010 16:15
quelle
6

probiere das

aus %Vor%     
Itay Karo 04.07.2010 16:14
quelle
3

Die Besetzung würde nur funktionieren, wenn Sie einen Konvertierungsoperator implementiert haben. Aber es ist kein sehr effektiver Ansatz.

Versuchen Sie, einen Typalias zu erstellen (wie in C ++ typedef)?

%Vor%

Jetzt können Sie zwischen CategoryObjCollection und List<CategoryObj> (das ist der gleiche Typ - nur anders benannt) frei konvertieren.

Ich würde auch eine andere Methode verwenden, um die Liste zu füllen:

%Vor%     
Jaroslav Jandek 04.07.2010 16:36
quelle
0

Warum schenkst du? Sie sollten eigentlich nicht Casting sein .... fügen Sie einfach eine Schleife über qry und füllen Sie Ihre cat Liste auf.

    
Saher Ahwal 04.07.2010 17:19
quelle

Tags und Links