2009-01-11 7 views
3

Tenir compte de type comme celui-ciExiste-t-il un bon moyen d'obtenir MethodInfo de méthode générique ouverte?

public interface IHaveGenericMethod 
{ 
    T1 Method<T1>(T1 parm); 
    T2 Method<T1,T2>(T1 parm); 
    int Method2(int parm); 
} 

Comment puis-je obtenir un METHODINFO pour ses méthodes? pour une méthode régulière non générique, comme method2, je peux aller avec

typeof(IHaveGenericMethod).GetMethod("methodName",new Type[]{typeof(itsParameters)}); 

pour une méthode générique bien, je ne peux pas, car ses paramètres ne sont pas types par-soi. Alors, comment je fais ça? Je sais que je peux appeler

typeof(IHaveGenericMethod).GetMethods() 

pour obtenir toutes les méthodes de ce type, puis itérer sur cette collection et faire un peu de mise en correspondance, mais il est laid. Y a-t-il un meilleur moyen?

+0

re "mais cela ne répond pas à ma question" - peut-être, mais voir "Mais plus propre rien." - AFAIK vous ne pouvez pas vraiment devenir beaucoup plus propre que cela. –

+0

duplication possible de [Comment obtenir MethodInfo d'une méthode générique?] (Http://stackoverflow.com/questions/326136/how-to-get-methodinfo-of-a-generic-method) – nawfal

Répondre

1

Eh bien, ils sont types - de sortes:

foreach (var method in typeof(IHaveGenericMethod).GetMethods()) 
    { 
     Console.WriteLine(method.Name); 
     if (method.IsGenericMethodDefinition) 
     { 
      foreach (Type type in method.GetGenericArguments()) 
      { 
       Console.WriteLine("> " + type.Name); 
      } 
     } 
    } 

vous pouvez donc vérifier par le nombre de args et vérifier la signature. Mais rien de plus propre.

+0

bien, oui, mais cela ne répond pas à ma question –

+0

(a répondu à la question d'origine donc elle apparait sur votre liste ...) –

+0

Assez juste. –

2

Assurez-vous de consulter la page MSDN "Reflection and Generic Types".

car ses paramètres ne sont pas types per se

En fait, je pense qu'il est parce que vous voulez interroger paramètres de type, mais la liste de type que vous pouvez fournir à GetMethod() est pas pour les paramètres de type . De plus, rappelez-vous que tout ce dont vous avez besoin pour sélectionner un «groupe de méthodes» de méthodes génériques est de connaître le nombre de paramètres de type générique. Donc vous pouvez simplement les compter.

itérer puis

Ne pas itérer, requête:

 var mi = from mi in typeof(IHaveGenericMethod).GetMethods() 
       where mi.Name == "Method" 
       where mi.IsGenericMethodDefinition 
       where mi.GetGenericArguments().Length == 2 
       select mi; 
+0

c'est sournois, mais il peut toujours retourner plus d'une méthode. Aussi, il faut LINQ, ergo .NET 3.5, ce que je voulais éviter. La seule amélioration que je pouvais penser est, au lieu de typeof (IHaveGenericMethod) .GetMethods() utiliser typeof (IHaveGenericMethod) .GetMembers (lots, de, arguments) –

Questions connexes