2009-03-08 9 views
1

Je dois invoquer une méthode surchargée en utilisant la réflexion. Mes cours comme ci-dessous:Invoquer la méthode des génériques surchargés en utilisant la réflexion

public static Transformer 
{ 
    //Overloaded method with generics parameter. First Transform Method 
    public static TranformerResult Transform<T>(object [] entities, 
     List<T> 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<T> GetTypes<T>() where T:class 
    { 
    } 
} 

J'essayé d'invoquer la première méthode de transformation avec la syntaxe ci-dessous:

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

Mais je reçois la deuxième méthode de transformation.

Mon intention est d'invoquer GetType sur transformerResult. Le transformateurResult est un objet qui renvoie l'invocation 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

Répondre

1

À moins que cela fonctionne: typeof(List<>) vous allez avoir besoin d'être un peu difficile avec ce que vous faites, semblable à ce que je devais faire avec ce post: http://www.aaron-powell.com/posts/2010-04-08-reflection-and-generics.html

Essentiellement en utilisant LINQ pour rechercher dans la collection de toutes les méthodes Transform, vous ne pouvez pas retrouver seulement celui que vous voulez natif.

+1

Le lien que vous avez envoyé RUPTURE. –

+0

@PeterO. le lien est fixé –

0

Je pense que le deuxième type dans le tableau de types dans l'appel à GetMethod() est des choses confuses. Si vous obtenez une instance de la classe Type de la classe contenant ces méthodes, cela n'inclut pas le paramètre générique réel utilisé pour créer cette instance de la classe (qui ressemble à Type, basé sur votre deuxième exemple de code). Au lieu de cela, il sait juste qu'il a un paramètre générique.

Je n'ai pas de compilateur devant moi actuellement, donc malheureusement je ne peux pas l'essayer, mais j'essayerais de spécifier l'équivalent de typeof(List<T>) pour le second paramètre (vous pourriez être en mesure d'obtenir ceci par appeler 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 de chercher dans le tableau vous-même.

3

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. Cela vous présente un peu d'une capture 22. Le paramètre générique est lié à la méthode de sorte que vous ne pouvez pas construire correctement le tableau de types pour la méthode tant que vous n'avez pas la méthode 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(); 
Questions connexes