Utilisez la réflexion pour sélectionner des méthodes génériques
Reflection permet d'appeler des méthodes avec des paramètres de type générique spécifiques, mais lorsque plusieurs surcharges génériques sont présentes, choisir la méthode appropriée peut être difficile. Cet article présente une approche au moment de la compilation pour sélectionner précisément une méthode générique cible en manipulant les objets d’informations délégués et de méthode.
Utiliser la méthode de sélection des délégués
Pour les méthodes statiques, la création d'un délégué avec le nombre requis de génériques et de paramètres permet la sélection de surcharges spécifiques. Par exemple, pour sélectionner la première surcharge de DoSomething<TModel>
, il ne dispose que d'un seul paramètre générique :
<code class="language-C#">var method = new Action<object>(MyClass.DoSomething<object>);</code>
soit la deuxième surcharge, qui possède deux paramètres génériques :
<code class="language-C#">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>
Pour les méthodes d'extension statiques, suivez un modèle similaire, en utilisant les types appropriés pour gérer les paramètres this
:
<code class="language-C#">var method = new Func<IQueryable<object>, Expression<Func<bool>>, IQueryable<object>>(Queryable.Where<object>);</code>
Obtenir des informations sur la méthode
La propriété du délégué Method
fournit l'objet MethodInfo
sous-jacent. Pour obtenir une définition de méthode générique et fournir des paramètres de type spécifiques :
<code class="language-C#">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>
Méthodes d'instance
Pour sélectionner une méthode d'instance, le processus est similaire :
<code class="language-C#">var method = new Action<object>(instance.MyMethod<object>); var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(type1);</code>
Sélection de la méthode de découplage et types de paramètres
Si les paramètres de type générique ne sont déterminés que ultérieurement :
<code class="language-C#">var methodInfo = method.Method.GetGenericMethodDefinition();</code>
Plus tard, transmettez le type souhaité à MakeGenericMethod()
:
<code class="language-C#">methodInfo.MakeGenericMethod(type1, type2);</code>
Conclusion
Cette approche permet une sélection précise de méthodes génériques au moment de la compilation, évitant ainsi les recherches d'exécution sujettes aux erreurs ou l'utilisation de chaînes. Il fournit un mécanisme robuste et flexible pour appeler des méthodes génériques avec différents paramètres 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!