Heim >Backend-Entwicklung >C++ >Können generische Klassen mit runtendbestimmten Typparametern instanziiert werden?
Laufzeit -Instanziierung generischer Klassen
In diesem Artikel wird die Herausforderung untersucht, eine generische Klasse mit einem zum Laufzeit festgelegten Typparameter zu instanziieren. Die direkte Verwendung einer runtend festgelegten Type
als generischer Typparameter ist aufgrund von Kompilierungszeitbeschränkungen unmöglich. Der Compiler benötigt den Betontyp zur Kompilierungszeit.
versucht dies direkt, wie unten gezeigt, zu einem Compiler -Fehler:
<code class="language-csharp">string typeName = "<read type name somewhere>"; // Runtime type name Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error</code>
Die Lösung beinhaltet die Nutzung der Reflexion. Das folgende Beispiel zeigt dies:
<code class="language-csharp">using System; using System.Reflection; public class Generic<T> { public Generic() { Console.WriteLine($"T={typeof(T)}"); } } class Test { static void Main() { string typeName = "System.String"; Type typeArgument = Type.GetType(typeName); Type genericClass = typeof(Generic<>); // Note the <> here Type constructedClass = genericClass.MakeGenericType(typeArgument); object created = Activator.CreateInstance(constructedClass); } }</code>
Der entscheidende Schritt besteht darin, Type.MakeGenericType()
zu verwenden. Diese Methode erstellt dynamisch einen neuen Typ, der eine generische Instanz von Generic<T>
darstellt, die T
durch die Laufzeit typeArgument
ersetzt. Activator.CreateInstance()
dann instanziiert dieser neu konstruierte Typ. Beachten Sie die Verwendung von Generic<>
, um den geöffneten generischen Typ anzugeben.
Das obige ist der detaillierte Inhalt vonKönnen generische Klassen mit runtendbestimmten Typparametern instanziiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!