Coretan kod C# ini meneroka menggunakan jenis instantiated sebagai parameter jenis dalam generik, tugas yang tidak disokong secara langsung oleh pengkompil. Artikel itu dengan betul menunjukkan bahawa cuba menggunakan pembolehubah Type
secara langsung (seperti myType
) sebagai parameter jenis generik menghasilkan ralat pengkompil.
Penyelesaian yang dibentangkan Leverages Reflection's MakeGenericType
kaedah. Kaedah ini secara dinamik mencipta jenis baru berdasarkan definisi jenis generik dan disediakan argumen jenis. Kaedah Activator.CreateInstance
kemudian meniru objek jenis yang baru dibuat ini.
Penjelasan jelas menunjukkan perbezaan antara pendekatan langsung (dan gagal) dan penyelesaian berasaskan refleksi. Bahagian pada parameter jenis berganda selanjutnya meningkatkan penjelasan dengan menunjukkan cara mengendalikan kelas generik dengan lebih daripada satu parameter jenis menggunakan MakeGenericType
.
untuk memperbaiki artikel, pertimbangkan untuk menambah:
Type.GetType
boleh kembali null
jika jenis tidak dijumpai. Menambah pemeriksaan null akan menjadikan kod lebih mantap.
lulus jenis instantiated sebagai parameter jenis untuk kelas generik dalam C#
Soalan timbul sama ada mungkin untuk meneliti kelas generik menggunakan jenis yang diperoleh pada runtime sebagai parameter jenisnya. Mencuba ini secara langsung, seperti yang ditunjukkan di bawah, menghasilkan ralat pengkompil:
di manaditakrifkan sebagai:
string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!
Mesej ralat biasanya "jenis atau ruang nama 'mytype' tidak dapat dijumpai." Ini kerana parameter jenis generik mesti diketahui pada masa penyusunan. MyGenericClass
public class MyGenericClass<T> { }
Refleksi menyediakan penyelesaian menggunakan dan . Pendekatan ini membolehkan membuat contoh generik dengan jenis yang ditentukan semasa runtime.
string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!
Kod ini pertama memeriksa jika Type.GetType
mengembalikan jenis yang sah. Kemudian, ia menggunakan MakeGenericType
untuk membuat jenis generik tertentu (Generic<string>
dalam kes ini) dan Activator.CreateInstance
untuk membuat contoh. Output konsol mengesahkan instantiasi yang berjaya.
Mengendalikan pelbagai parameter jenis
Untuk kelas generik dengan parameter jenis berganda, cukup berikan hujah jenis kepada MakeGenericType
sebagai senarai yang dipisahkan koma:
public class MyGenericClass<T> { }
Pertimbangan penting:
Type.GetType
untuk mengelakkan pengecualian. Versi yang lebih baik ini memberikan penjelasan yang lebih lengkap dan mantap mengenai penyelesaiannya, termasuk butiran penting mengenai pengendalian ralat dan implikasi prestasi. Ingatlah untuk menggantikan /uploads/20250201/1738384525679da48d1633c.jpg
dengan laluan sebenar ke imej anda.
Atas ialah kandungan terperinci Bolehkah anda lulus jenis instantiated sebagai parameter jenis dalam C# Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!