Maison >développement back-end >C++ >Comment sélectionner la bonne méthode générique surchargée dans .NET à l'aide de Reflection ?

Comment sélectionner la bonne méthode générique surchargée dans .NET à l'aide de Reflection ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-11 13:31:42533parcourir

How to Select the Correct Overloaded Generic Method in .NET Using Reflection?

Utilisez la réflexion pour choisir la bonne méthode générique

Défi : Identifier les méthodes génériques surchargées

Dans .NET, lorsqu'il existe plusieurs surcharges de méthodes génériques, il peut être difficile d'essayer d'utiliser la réflexion pour sélectionner la bonne version. Par exemple, une méthode statique de la classe System.Linq.Queryable a deux définitions pour la méthode Where :

<code class="language-c#">static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T, bool>> predicate)</code>
La méthode

en réflexion n'est pas suffisante pour cette tâche car elle ne permet pas de différencier ces surcharges. GetMethod

Solution : Utiliser des délégués paramétrés

Afin de choisir la bonne méthode générique, on peut adopter une technique qui consiste à créer des délégués paramétrés. Nous pouvons sélectionner la méthode au moment de la compilation en créant un délégué

ou Action qui correspond au nombre générique et au nombre de paramètres de la surcharge souhaitée : Func

Exemple 1 : Sélectionnez une méthode qui prend un type générique et un seul paramètre : Where

<code class="language-c#">var method = new Action<object>(MyClass.DoSomething<object>);</code>

Exemple 2 : Sélection d'une méthode qui prend deux types génériques et deux paramètres : Where

<code class="language-c#">var method = new Action<object, object>(MyClass.DoSomething<object, object>);</code>
Cette approche nous permet d'obtenir les méthodes dont nous avons besoin sans recourir à des recherches de chaînes ou d'exécution risquées.

Obtenir l'objet MethodInfo

Si vous avez besoin de l'objet

, vous pouvez l'obtenir après avoir créé le délégué : MethodInfo

<code class="language-c#">var methodInfo = method.Method.MakeGenericMethod(type1, type2);</code>
Méthode d'extension statique

Les méthodes d'extension statique nécessitent une approche légèrement plus complexe, mais les mêmes principes s'appliquent :

<code class="language-c#">var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);

var methodInfo = method.Method.MakeGenericMethod(modelType);</code>
Découplage MethodInfo et types de paramètres

Parfois, il peut être nécessaire de découpler

les types d'objet et de paramètre : MethodInfo

<code class="language-c#">var methodInfo = method.Method.GetGenericMethodDefinition();

methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });</code>
Cette technique vous permet d'effectuer des opérations complexes telles que la sélection de méthodes d'instance dans une classe et de les exposer pour une utilisation sur différents types.

Conclusion

En utilisant des délégués paramétrés, nous pouvons contourner les limitations de

et sélectionner la méthode générique correcte au moment de la compilation. Cette approche garantit la sécurité des types et évite les recherches dynamiques inutiles. GetMethod

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