Maison >développement back-end >C++ >Pouvez-vous passer un type instancié en tant que paramètre de type en génériques C #?
Cet extrait de code C # explore en utilisant les types instanciés comme paramètres de type dans les génériques, une tâche non directement prise en charge par le compilateur. L'article souligne correctement que la tentative d'utilisation d'une variable Type
directement (comme myType
) comme paramètre de type générique entraîne une erreur du compilateur.
La solution présentée exploite la méthode MakeGenericType
de la réflexion. Cette méthode crée dynamiquement un nouveau type basé sur une définition de type générique et a fourni des arguments de type. La méthode Activator.CreateInstance
instancie ensuite un objet de ce type nouvellement créé.
L'explication démontre clairement la différence entre l'approche directe (et défaillante) et la solution basée sur la réflexion. La section sur les paramètres de type multiple améliore encore l'explication en montrant comment gérer les classes génériques avec plus d'un paramètre de type en utilisant MakeGenericType
.
Pour améliorer l'article, envisagez d'ajouter:
Type.GetType
peut retourner null
si le type n'est pas trouvé. L'ajout d'une vérification nulle rendrait le code plus robuste. Voici un exemple de l'apparence de l'article amélioré:
passer un type instancié comme un paramètre de type pour une classe générique en C #
La question se pose de savoir s'il est possible d'instancier une classe générique en utilisant un type obtenu à l'exécution comme paramètre de type. Tenter cela directement, comme indiqué ci-dessous, se traduit par une erreur du compilateur:
<code class="language-csharp">string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!</code>
où MyGenericClass
est défini comme:
<code class="language-csharp">public class MyGenericClass<T> { }</code>
Le message d'erreur est généralement "le type ou l'espace de noms" myType "n'a pas pu être trouvé." En effet, les paramètres de type générique doivent être connus au moment de la compilation.
Solution basée sur la réflexion: instanciation générique dynamique
La réflexion fournit une solution de contournement en utilisant MakeGenericType
et Activator.CreateInstance
. Cette approche permet de créer des instances génériques avec des types déterminés lors de l'exécution.
<code class="language-csharp">string typeName = "System.String"; // Or read from somewhere Type myType = Type.GetType(typeName); MyGenericClass<myType> myGenericClass = new MyGenericClass<myType>(); // Compiler error!</code>
Ce code vérifie d'abord si Type.GetType
a renvoyé un type valide. Ensuite, il utilise MakeGenericType
pour créer le type générique spécifique (Generic<string>
dans ce cas) et Activator.CreateInstance
pour créer une instance. La sortie de la console confirme une instanciation réussie.
Gestion des paramètres de type multiple
Pour les classes génériques avec des paramètres de type multiple, fournissez simplement les arguments de type à MakeGenericType
en tant que liste séparée par des virgules:
<code class="language-csharp">public class MyGenericClass<T> { }</code>
Considérations importantes:
Type.GetType
pour éviter les exceptions. Cette version améliorée fournit une explication plus complète et robuste de la solution, y compris les détails cruciaux sur la gestion des erreurs et les implications de performances. N'oubliez pas de remplacer /uploads/20250201/1738384525679da48d1633c.jpg
par le chemin réel vers votre image.
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!