Invoquer une méthode surchargée de génériques à l’aide de la reflection

J’ai besoin d’invoquer une méthode surchargée en utilisant la reflection. Mes cours comme ci-dessous:

public static Transformer { //Overloaded method with generics parameter. First Transform Method public static TranformerResult Transform(object [] entities, List dataContract) where T:class { return transformerResult; } //Overloaded method without generics parameter. Second Transform Method public static TranformerResult Transform(object entities, Type dataContract) { return transformerResult; } } public class TransformerResult { public List GetTypes() where T:class { } } 

J’ai essayé d’appeler la première méthode Transform avec la syntaxe ci-dessous:

 GetMethod(“Transform”,(BindingFlags.Static | BindingFlags.Public), null, new Type[](){typeof(object[]),typeof(List}, null) 

Mais j’obtiens la deuxième méthode de transformation.

Mon intention est d’appeler GetType sur transformerResult. TransformerResult est un object qui renvoie l’appel de la première méthode de transformation.

Quelqu’un peut-il m’aider à écrire le code C # pour réaliser mon intention?

Merci Mahir

La raison pour laquelle vous rencontrez un problème est que la méthode que vous recherchez est générique. L’un des types de la méthode est basé sur le paramètre générique de la méthode. Le paramètre générique est lié à la méthode. Vous ne pouvez donc pas construire correctement le tableau de types pour la méthode tant que vous n’avez pas la méthode en elle-même.

Une solution pour ce scénario spécifique consiste à saisir la première méthode générique.

 var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First(); 

À moins que cela ne fonctionne: typeof(List<>) vous allez devoir être un peu délicat avec ce que vous faites, comme ce que j’avais à faire avec ce post: http://www.aaron-powell.com/posts /2010-04-08-reflection-and-generics.html

En utilisant essentiellement LINQ pour rechercher dans la collection de toutes les méthodes Transform , vous ne pouvez pas récupérer uniquement celle que vous voulez en natif.

Je pense que le deuxième type du tableau de types de l’appel à GetMethod() est source de confusion. Si vous obtenez une instance de la classe Type de la classe contenant ces méthodes, elle n’inclut pas le paramètre générique utilisé pour créer cette instance de la classe (qui ressemble à Type , d’après votre deuxième exemple de code). Au lieu de cela, il sait simplement qu’il possède un paramètre générique.

Je n’ai pas de compilateur devant ma version actuelle, donc je ne peux malheureusement pas l’essayer, mais j’essayerais de spécifier l’équivalent de typeof(List) pour le second paramètre (vous pourriez peut-être obtenir ceci en appelant System.Collections.Generic.List.GetType() , mais je ne suis pas positif).

Si cela ne fonctionne pas, la seule autre option à laquelle je peux penser est d’appeler Type.GetMethods(BindingFlags.Static | BindingFlags.Public) et d’effectuer une recherche dans le tableau vous-même.