Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membuat Objek C# Generik Secara Dinamik Menggunakan Refleksi?
Gunakan refleksi untuk mencipta objek C# generik secara dinamik
Dalam pembangunan C#, selalunya perlu untuk mencipta objek generik secara dinamik. Ini menimbulkan cabaran kerana maklumat jenis tidak selalu tersedia. Artikel ini akan meneroka cara menyelesaikan masalah ini menggunakan refleksi dan kaedah Activator.CreateInstance
.
Andaikan kita mempunyai kelas berikut:
<code class="language-csharp">public class Item { } public class Task<T> { } public class TaskA<T> : Task<T> { } public class TaskB<T> : Task<T> { }</code>
Matlamat kami adalah untuk mencipta tika TaskA
atau TaskB
secara dinamik berdasarkan rentetan yang mewakili nama jenisnya yang layak sepenuhnya (contohnya, "ruang nama.TaskA" atau "ruang nama.TaskB").
Penyelesaian boleh dicapai dengan mengikuti langkah berikut:
Task<T>
). new Type[] { typeof(Item) }
). Type.MakeGenericType
untuk menjana jenis tertentu (TaskA
atau TaskB
). Activator.CreateInstance
untuk membuat seketika objek generik. Contohnya, cipta objek TaskA<Item>
menggunakan pantulan:
<code class="language-csharp">var taskType = typeof(Task); Type[] typeArgs = { typeof(Item) }; var makeme = taskType.MakeGenericType(typeArgs); object o = Activator.CreateInstance(makeme);</code>
Jika nama jenis ditentukan sebagai rentetan, anda boleh menggunakan kaedah berikut:
<code class="language-csharp">var taskType = Type.GetType("namespace.TaskA`1"); //注意`1`表示泛型参数个数 Type[] typeArgs = { typeof(Item) }; var makeme = taskType.MakeGenericType(typeArgs); object o = Activator.CreateInstance(makeme);</code>
Teknologi ini membenarkan instantiasi dinamik objek generik berdasarkan nama jenis, menyediakan penyelesaian yang fleksibel dan berkuasa untuk mengendalikan jenis generik yang tidak diketahui pada masa jalan. Ambil perhatian bahawa kaedah Type.GetType
memerlukan maklumat ruang nama yang lengkap dan TaskA
selepas 1
menunjukkan bahawa kelas generik mempunyai parameter jenis.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membuat Objek C# Generik Secara Dinamik Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!