2017-12-26 19 views
-2

Ich habe ein Objekt vom Typ object Wer, wenn ich GetType() darauf aufrufen, gibt einen Typ von HashSet<Availability> in einem Fall, aber zurück eine nicht verwandte Art von HashSet<Contact> in einem anderen Fall, oder eine beliebige Anzahl von bis jetzt unbekannten HashSet<...> Arten.In C# können Sie einen Objekttyp auf eine Sammlungsart von generischen "Objekt" upgraden

object myObject = getMyObject(); 
myObject.GetType() // = HashSet<Availability> 

Ich möchte oben Guss, das Objekt zu einer Sammlung von irgendeiner Art (HashSet oder andere) während des Herunter Gießen der generische Typ der Sammlung zu einem Objekt, so dass der Code nicht die as- wissen muss noch unbekannte Typen zur Kompilierzeit.

object myObject = getMyObject(); 
myObject.GetType() // = HashSet<Availability> 
var myUsefulObject = (HashSet<object>)myObject; 

Wenn ich dies versuche, bekomme ich eine Ausnahme "nicht in der Lage zu werfen ...".

Ist das möglich? Wenn ja, wie?

Ich glaube, ich Kovarianz zwischen dem HashSet Typ habe, die ich habe, und das, was ich will, sondern weil mein anfänglichen Typ nur ein Objekt ist, bin ich nicht in der Lage, was this stack-overflow answer suggests zu tun.

+3

* Ist das möglich? * - Nein. Das ist alles ein Traum. Der Compiler sagt Ihnen nicht wirklich, dass Ihre Überzeugungen über Kovarianz falsch sind, und es ist irrelevant, dass das, was Sie tun, zutiefst, grundlegend anders ist als das, was in dieser Antwort steht. –

+1

Angenommen, Sie könnten 'HashSet ' auf 'HashSet ' übertragen. Dann könnten Sie folgendes tun: '(new HashSet () als HashSet ) .Add (" LOL ")'. Sieht das für Sie eine gute Idee aus? –

+0

Auch, * warum * möchten Sie das tun? Was ist das Endziel? –

Antwort

0

So lange Kette von Kommentaren unter Ihrer Frage zeigt - Sie können HashSet<Availability> nicht zu HashSet<object>, weil es nur keine implizite \ explizite \ andere Konvertierung zwischen diesen beiden Typen definiert ist. Allerdings implementiert HashSet<T> mehrere covariant Schnittstellen wie IReadOnlyCollection<T> und IEnumerable<T>, und Sie können HashSet<Availability> an diesen Schnittstellen (von object) Stimmen:

object myObject = getMyObject(); 
var myUsefulObject = (IReadOnlyCollection<object>)myObject; 

Wenn Typ T covariant in Schnittstelle ist - diese Art kann nicht als Argument verwendet werden, in jede Methode in dieser Schnittstelle und kann nur als Rückgabetyp verwendet werden. Das bedeutet, dass alle Methoden, die in diesem Fall die Typensicherheit unterbrechen könnten (wie Add(T item), Remove(T item) usw.), in einer solchen Schnittstelle nicht vorhanden sein können und die Rückgabe Availability als object kein Problem darstellt.

Verwandte Themen