Utilisez la réflexion pour créer dynamiquement des objets C# génériques
En développement C#, il est souvent nécessaire de créer dynamiquement des objets génériques. Cela crée des défis puisque les informations sur le type ne sont pas toujours disponibles. Cet article explorera comment résoudre ce problème en utilisant la réflexion et la méthode Activator.CreateInstance
.
Supposons que nous ayons la classe suivante :
<code class="language-csharp">public class Item { } public class Task<T> { } public class TaskA<T> : Task<T> { } public class TaskB<T> : Task<T> { }</code>
Notre objectif est de créer dynamiquement une instance de TaskA
ou TaskB
basée sur une chaîne représentant son nom de type complet (par exemple, "namespace.TaskA" ou "namespace.TaskB").
La solution peut être obtenue en suivant ces étapes :
Task<T>
). new Type[] { typeof(Item) }
). Type.MakeGenericType
pour générer un type spécifique (TaskA
ou TaskB
). Activator.CreateInstance
pour instancier des objets génériques. Par exemple, créez un TaskA<Item>
objet en utilisant la réflexion :
<code class="language-csharp">var taskType = typeof(Task); Type[] typeArgs = { typeof(Item) }; var makeme = taskType.MakeGenericType(typeArgs); object o = Activator.CreateInstance(makeme);</code>
Si le nom du type est spécifié sous forme de chaîne, vous pouvez utiliser la méthode suivante :
<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>
Cette technologie permet l'instanciation dynamique d'objets génériques basés sur des noms de types, offrant ainsi une solution flexible et puissante pour gérer les types génériques inconnus au moment de l'exécution. Notez que la méthode Type.GetType
nécessite des informations complètes sur l'espace de noms et que le TaskA
après le 1
indique que la classe générique a un paramètre de type.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!