Maison >développement back-end >C++ >Comment puis-je créer des objets C# génériques avec une spécification de type dynamique à l'aide de Reflection ?

Comment puis-je créer des objets C# génériques avec une spécification de type dynamique à l'aide de Reflection ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-22 09:41:08951parcourir

How Can I Create Generic C# Objects with Dynamic Type Specification Using Reflection?

Utilisez la réflexion pour créer des objets génériques C# avec une spécification de type dynamique

En C#, vous devrez peut-être créer dynamiquement un objet générique, tel qu'une instance de la classe Task, dont le type T n'est pas connu au préalable. Vous pouvez utiliser la méthode Activator.CreateInstance conjointement avec la réflexion C# pour résoudre ce problème.

Pour créer dynamiquement un objet TaskA ou TaskB générique, suivez ces étapes :

  1. Déterminez le type de classe générique : Utilisez Type.GetType() pour obtenir les informations de type de la classe générique, telles que "namespace.TaskA" ou "namespace.TaskB".
  2. Spécifiez les paramètres de type générique : Déterminez les paramètres de type de la classe générique, tels que typeof(Item).
  3. Créez un type générique : Utilisez MakeGenericType pour créer un type générique spécifique sur un type de classe générique, par exemple makeme = d1.MakeGenericType(typeArgs).
  4. Créer une instance : Utilisez Activator.CreateInstance pour créer une instance d'un type générique généré dynamiquement, par exemple objet o = Activator.CreateInstance(makeme).

Par exemple :

<code class="language-csharp">Type d1 = Type.GetType("namespace.TaskA`1");
Type[] typeArgs = { typeof(Item) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);</code>

Si une classe générique accepte plusieurs paramètres de type, veillez à inclure une virgule lorsque vous omettez le nom du type, par exemple :

<code class="language-csharp">Type type = typeof(IReadOnlyDictionary<,>); </code>

Remarque : L'exemple de code suppose que "namespace.TaskA1" 和Item是已定义的类型。 实际应用中,需要根据您的具体项目替换这些占位符。 此外,错误处理(例如,处理Type.GetType()` renvoie null) est critique dans un environnement de production.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn