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
Libérer: 2025-01-11 13:31:42
original
600 Les gens l'ont consulté

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 :

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)
Copier après la connexion
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

var method = new Action<object>(MyClass.DoSomething<object>);
Copier après la connexion

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

var method = new Action<object, object>(MyClass.DoSomething<object, object>);
Copier après la connexion
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

var methodInfo = method.Method.MakeGenericMethod(type1, type2);
Copier après la connexion
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 :

var method = new Func<IQueryable<object>, Expression<Func<object, bool>>, IQueryable<object>>(Queryable.Where<object>);

var methodInfo = method.Method.MakeGenericMethod(modelType);
Copier après la connexion
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

var methodInfo = method.Method.GetGenericMethodDefinition();

methodInfo.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });
Copier après la connexion
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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal