Dieser C# -Codes -Snippet erforscht mithilfe von instanziierten Typen als Typparameter in Generika, eine Aufgabe, die vom Compiler nicht direkt unterstützt wird. Der Artikel weist korrekt darauf hin, dass der Versuch, eine Type
-Variable direkt (wie myType
) als Generikentypparameter zu verwenden, zu einem Compiler -Fehler führt.
Die vorgestellte Lösung nutzt die MakeGenericType
-Methode der Reflexion. Diese Methode erstellt dynamisch einen neuen Typ, der auf einer generischen Typdefinition basiert und Typargumente bereitgestellt hat. Die Activator.CreateInstance
-Methode instanziiert dann ein Objekt dieses neu erstellten Typs.
Die Erklärung zeigt deutlich den Unterschied zwischen dem direkten (und fehlenden) Ansatz und der reflektionsbasierten Lösung. Der Abschnitt zu mehreren Typparametern verbessert die Erläuterung weiter, indem angezeigt wird
MakeGenericType
Um den Artikel zu verbessern, sollten Sie hinzufügen:
Type.GetType
null
Übergeben eines instanziierten Typs als Typparameter für eine generische Klasse in C#
stellt sich die Frage, ob es möglich ist, eine generische Klasse mit einem Typ zu instanziieren, der zur Laufzeit als Typparameter erhalten wurde. Der Versuch, dies direkt wie unten gezeigt zu versuchen, führt zu einem Compiler -Fehler:
<code class="language-csharp">string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!</code>
definiert ist als: MyGenericClass
<code class="language-csharp">public class MyGenericClass<T> { }</code>
Reflexionsbasierte Lösung: Dynamische generische Instanziierung
Reflection liefert eine Problemumgehung mit
und. Dieser Ansatz ermöglicht das Erstellen generischer Instanzen mit zum zur Laufzeit ermittelten Typen. MakeGenericType
<code class="language-csharp">string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!</code>
Dieser Code überprüft zuerst, wenn Type.GetType
einen gültigen Typ zurückgegeben hat. Dann verwendet es MakeGenericType
, um den spezifischen generischen Typ (Generic<string>
in diesem Fall) und Activator.CreateInstance
zu erstellen, um eine Instanz zu erstellen. Die Konsolenausgabe bestätigt eine erfolgreiche Instanziierung.
Handhabung mehrerer Typparameter
Geben Sie für generische Klassen mit mehreren Typparametern einfach die Typ-Argumente für MakeGenericType
als von Kommas getrennte Liste an:
<code class="language-csharp">public class MyGenericClass<T> { }</code>
Wichtige Überlegungen:
Type.GetType
zurückgegeben werden, um Ausnahmen zu verhindern. Diese verbesserte Version bietet eine vollständigere und robustere Erklärung der Lösung, einschließlich entscheidender Details zu Fehlerbehelden und Auswirkungen auf die Leistung. Denken Sie daran, /uploads/20250201/1738384525679da48d1633c.jpg
durch den tatsächlichen Pfad zu Ihrem Bild zu ersetzen.
Das obige ist der detaillierte Inhalt vonKönnen Sie einen instanziierten Typ als Typparameter in C# Generika übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!