Utilisation de types de variables comme paramètres dans les méthodes génériques C#
Les génériques en C# offrent un moyen de créer des méthodes et des classes flexibles qui peuvent fonctionner sur différents types de données sans avoir à implémenter des implémentations distinctes pour chaque type. Cependant, utiliser le type d'une variable comme paramètre dans une méthode générique peut s'avérer difficile, surtout si le type n'est pas connu au moment de la compilation.
Considérez la méthode générique suivante :
<code class="language-csharp">bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;</code>
Cette méthode vérifie si une entité existe en fonction de son GUID et de sa transaction. Pour utiliser cette méthode, le type de l’entité doit être connu au moment de la compilation. Cela se fait généralement en spécifiant explicitement les paramètres de type lors de l'appel de la méthode, comme ceci :
<code class="language-csharp">DoesEntityExist<MyType>(entityGuid, transaction);</code>
Cependant, nous ne pouvons pas utiliser la méthode ci-dessus si le type de l'entité n'est connu qu'au moment de l'exécution. Tenter d'appeler cette méthode avec une variable de type Type entraîne une erreur du compilateur :
<code>找不到类型或命名空间名称“T”(是否缺少 using 指令或程序集引用?)</code>
Pour résoudre ce problème, nous pouvons utiliser la réflexion pour appeler la méthode générique avec les paramètres de type requis. Voici comment procéder :
<code class="language-csharp">Type t = entity.GetType(); MethodInfo method = GetType().GetMethod("DoesEntityExist") .MakeGenericMethod(new Type[] { t }); method.Invoke(this, new object[] { entityGuid, transaction });</code>
Cependant, cette approche est moins efficace et peut être difficile à maintenir. Par conséquent, il est généralement recommandé de définir des méthodes génériques de telle manière que les paramètres de type soient passés en arguments. Cela nous permet de maintenir la sécurité des types au moment de la compilation tout en utilisant l'inférence de type dynamique requise au moment de l'exécution.
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!