Maison >développement back-end >C++ >Comment puis-je sélectionner en toute sécurité la surcharge de méthode générique correcte à l'aide de Reflection en C# ?

Comment puis-je sélectionner en toute sécurité la surcharge de méthode générique correcte à l'aide de Reflection en C# ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-11 13:27:42179parcourir

How Can I Safely Select the Correct Generic Method Overload Using Reflection in C#?

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

Lors de l'utilisation de méthodes génériques via réflexion, choisir la surcharge correcte peut être difficile lorsqu'il existe plusieurs surcharges génériques. Ce problème se produit lorsque le nom de la méthode est ambigu, comme la méthode « Where » dans la classe System.Linq.Queryable.

Au lieu de s'appuyer sur des hypothèses ou de vérifier les noms de méthodes, il existe un moyen sûr au moment de la compilation de sélectionner la surcharge générique correcte à l'aide de délégués.

Méthode statique

Considérez la méthode statique suivante avec plusieurs surcharges génériques :

<code class="language-csharp">public static void DoSomething<TModel>(TModel model)

public static void DoSomething<TViewModel, TModel>(TViewModel viewModel, TModel model)</code>

Pour sélectionner la première surcharge (type de retour void, un paramètre générique), créez un délégué d'opération correspondant à sa signature :

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

Pour la deuxième surcharge (type de retour void, deux paramètres génériques), utilisez un délégué d'action avec deux paramètres d'objet :

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

Cette méthode sélectionne la surcharge correcte en fonction du nombre générique et du nombre d'arguments du délégué.

Pour obtenir un objet MethodInfo, utilisez la propriété Method du délégué et appelez MakeGenericMethod() :

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

Méthode d'extension statique

Pour les méthodes d'instance, utilisez une méthode de sélection de méthode similaire, mais appelez GetGenericMethodDefinition() avant de transmettre le type à MakeGenericMethod() :

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

Découplage MethodInfo et types de paramètres

Vous pouvez obtenir un objet MethodInfo générique en appelant GetGenericMethodDefinition(), découplant ainsi la sélection des objets MethodInfo des types de paramètres :

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

Ensuite, transmettez les types nécessaires à MakeGenericMethod() lors de l'appel de la méthode :

<code class="language-csharp">processCollection(methodInfo, type2);

...

protected void processCollection(MethodInfo method, Type type2)
{
    var type1 = typeof(MyDataClass);
    object output = method.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });
}</code>

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