Rumah >pembangunan bahagian belakang >C++ >Bolehkah kelas generik diberi instantiated dengan parameter jenis runtime yang ditentukan?
instantiasi runtime kelas generik
Artikel ini meneroka cabaran untuk menafikan kelas generik dengan parameter jenis yang ditentukan semasa runtime. Secara langsung menggunakan pembolehubah yang ditentukan oleh runtime sebagai parameter jenis generik adalah mustahil kerana kekangan kompilasi masa. Pengkompil memerlukan jenis konkrit pada masa penyusunan. Type
<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>Penyelesaian melibatkan refleksi memanfaatkan. Contoh berikut menunjukkan ini:
<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>Langkah penting menggunakan
. Kaedah ini secara dinamik mencipta jenis baru yang mewakili contoh generik Type.MakeGenericType()
, menggantikan Generic<T>
dengan runtime T
. typeArgument
kemudian instantiates jenis yang baru dibina ini. Perhatikan penggunaan Activator.CreateInstance()
untuk menentukan jenis generik terbuka. Generic<>
Atas ialah kandungan terperinci Bolehkah kelas generik diberi instantiated dengan parameter jenis runtime yang ditentukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!