Array von einer generischen Klasse mit unbekannter Typ
Ist es möglich in C# zu erstellen, die ein array von unbekannter generische Typen? Etwas entlang der Linien von:
ShaderParam<>[] params = new ShaderParam<>[5];
params[0] = new ShaderParam<float>();
Oder ist das einfach nicht möglich, da die C#'s starke Typisierung?
InformationsquelleAutor Hannesh | 2011-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht möglich. In dem Fall, wo der generische Typ ist unter Ihrer Kontrolle, Sie können erstellen einer nicht-generischen Basistyp, z.B.
Meine Vermutung ist, dass dies ist ein XNA-Typ Sie haben keine Kontrolle über obwohl.
InformationsquelleAutor Jon Skeet
Du könnte Verwendung eines kovariante Schnittstelle für
ShaderParam<T>
:Verwendung:
Aber Sie nicht verwenden können, es mit Wert-Typen wie
float
im Ihre Beispiel. Kovarianz gilt nur mit Referenz-Typen (wiestring
im meine Beispiel). Sie auch nicht verwenden können, es, wenn der Typ-parameter wird in kontravariant Positionen, z.B. als Parameter der Methode. Dennoch ist es vielleicht gut zu wissen über diese Technik.InformationsquelleAutor Jordão
Das würde keinen Sinn machen.
Was würde passieren, wenn Sie schreiben
params[3]
?Wie würde es sein?
Möglicherweise möchten Sie erstellen eine nicht-generische Basisklasse oder Schnittstelle, und verwenden Sie ein array von Ihnen.
InformationsquelleAutor SLaks
Dies ist möglich, in einem generische Klasse oder eine generische Erweiterung Methode wobei T definiert ist:
InformationsquelleAutor Aliostad
Nein, das Konzept
ShaderParam<>
ist bedeutungslos, wie weit einen instanziierten Typ betroffen ist. In anderen Worten, eine konkreteShaderParam<float>
ist nicht eine Instanz vonShaderParam<>
. Daher der deklarierte Typ des Arrays werden illegal für die holding, die Instanz. (Jenseits der Tatsache, dass es bereits illegale syntax, um mit zu beginnen.)InformationsquelleAutor Kirk Woll
erstellen Sie ein array von unbekannter generische Typen:
Wenn Sie brauchen, um irgendeine Art bestimmte Aktionen auf dem Objekt, das Sie verwenden könnte, Reflexion
Hoffe, das hilft.
InformationsquelleAutor Vinnyq12
Ziemlich spät, um das Spiel, aber hier ist, wie: http://www.codeproject.com/Articles/1097830/Down-the-Rabbit-Hole-with-Array-of-Generics
InformationsquelleAutor Marc Clifton
Nicht direkt. Eine geschlossene generisch ist, ist eine bestimmte "Art" hinter den kulissen, so dass sogar ein open-generic ist zu allgemein, um ein "starker Typ".
Die beste Lösung, die ich denken kann, die ich vorher benutzt haben, ist das erstellen einer nicht-generischen Vorfahren der generischen Klasse. Ob diese Lösung funktioniert, hängt davon ab, was Sie planen, verwenden Sie die array.
InformationsquelleAutor KeithS