Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membuat Objek C# Generik Secara Dinamik Menggunakan Refleksi?

Bagaimanakah Saya Boleh Membuat Objek C# Generik Secara Dinamik Menggunakan Refleksi?

Barbara Streisand
Barbara Streisandasal
2025-01-22 09:47:09444semak imbas

How Can I Dynamically Create Generic C# Objects Using Reflection?

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:

  1. Mendapat jenis asas (Task<T>).
  2. Mentakrifkan parameter jenis yang akan dibekalkan sebagai tatasusunan (contohnya, new Type[] { typeof(Item) }).
  3. Gunakan Type.MakeGenericType untuk menjana jenis tertentu (TaskA atau TaskB).
  4. Gunakan 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn