Maison >développement back-end >C++ >Comment sélectionner de manière fiable la surcharge de méthode générique correcte à l'aide de Reflection ?

Comment sélectionner de manière fiable la surcharge de méthode générique correcte à l'aide de Reflection ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-11 13:42:43285parcourir

How to Reliably Select the Correct Generic Method Overload Using Reflection?

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

Contexte

Reflection permet aux développeurs d'accéder aux informations de type et d'appeler dynamiquement des méthodes. Cependant, faire la distinction entre les surcharges peut s’avérer difficile lors du choix d’une méthode générique. Par exemple, la classe System.Linq.Queryable contient des définitions pour plusieurs méthodes Where, ce qui rend difficile le choix de la version requise.

Choisissez la bonne méthode en fonction du type de paramètre

Pour résoudre ce problème, vous pouvez utiliser une solution sécurisée pour la compilation :

1. Créez un délégué ou une expression qui correspond à la surcharge souhaitée

Construisez un délégué ou une expression avec le nombre et le type corrects de paramètres génériques et de méthode qui correspondent à la surcharge cible. Par exemple :

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

2. Obtenez des informations génériques sur la méthode

Extrayez MethodInfo d'un délégué ou d'une expression et utilisez GetGenericMethodDefinition pour obtenir la définition de la méthode générique.

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

3. Spécifiez les paramètres de type générique

Transmettez les paramètres de type générique réels à MakeGenericMethod pour instancier une méthode générique spécifique.

<code class="language-csharp">var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>

Exemple d'utilisation de la surcharge Queryable.Where

Pour Queryable.Where méthode avec surcharge :

<code class="language-csharp">public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, bool>>)

public static IQueryable<TModel> Where<TModel>(this IQueryable<TModel>, Expression<Func<TModel, int, bool>>)</code>

Le code suivant montre comment sélectionner la première version :

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

var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(modelType);</code>

Découplage MethodInfo et types de paramètres

Pour une plus grande flexibilité, vous pouvez obtenir MethodInfo séparément et spécifier les paramètres de type générique ultérieurement. Ceci est utile lorsque le type est inconnu lors de la récupération de la méthode.

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

var typedMethod = methodInfo.MakeGenericMethod(type1, type2);</code>

En suivant ces étapes, les développeurs peuvent sélectionner la méthode générique correcte par réflexion de manière flexible et sécurisée pour la compilation, même s'il existe plusieurs surcharges.

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