2009-07-11 6 views
23

J'ai un MethodInfo d'une méthode d'interface et Type d'une classe qui implémente l'interface . Je veux trouver le MethodInfo de la méthode de classe qui implémente la méthode d'interface. Le method.GetBaseDefinition() simple ne fonctionne pas avec les méthodes d'interface. La recherche par nom ne fonctionnera pas non plus, car lors de l'implémentation explicite de la méthode d'interface, elle peut avoir n'importe quel nom (oui, pas en C#).Comment obtenir MethodInfo de méthode d'interface, ayant implémentant MethodInfo de méthode de classe?

Alors, quelle est la correcte façon de faire cela qui couvre toutes les possibilités?

Répondre

33

OK, j'ai trouvé un moyen, en utilisant GetInterfaceMap.

var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType); 
var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod); 

if (index == -1) 
{ 
    //this should be literally impossible 
} 

return map.TargetMethods[index]; 
1

Hmmm - je ne suis pas sûr de la correcte façon, mais vous pouvez le faire en faisant une boucle sur toutes les interfaces de votre type, puis en recherchant les interfaces pour la méthode. Vous ne savez pas si vous pouvez le faire directement sans passer par les interfaces, car vous êtes bloqué sans GetBaseDefinition().

Pour mon interface avec une seule méthode (MyMethod) et mon type (MyClass) qui met en oeuvre cette méthode, je peux l'utiliser:

MethodInfo interfaceMethodInfo = typeof(IMyInterface).GetMethod("MyMethod"); 
MethodInfo classMethodInfo = null; 
Type[] interfaces = typeof(MyClass).GetInterfaces(); 

foreach (Type iface in interfaces) 
{ 
    MethodInfo[] methods = iface.GetMethods(); 

    foreach (MethodInfo method in methods) 
    { 
     if (method.Equals(interfaceMethodInfo)) 
     { 
      classMethodInfo = method; 
      break; 
     } 
    } 
} 

Vous auriez à vérifier que les MethodInfo.Equals fonctionne si le deux méthodes ont des noms différents. Je ne savais même pas que c'était possible, probablement parce que je suis un C# 'er

+0

Vous ne pouvez pas faire correspondre par nom. Les noms ne doivent pas correspondre. C'est une règle C#, d'autres langages (VB) vous permettent de nommer les méthodes de remplacement comme bon vous semble. –

+0

Mon exemple ci-dessus ne correspond pas par nom, il correspond à la méthode Equals sur MethodInfo. Je pensais juste que vous auriez besoin de vérifier que MethodInfo.Equals considère toujours deux instances égales si elles ne varient que par le nom. –

+0

Bien, désolé, mais votre code ne fait toujours pas ce dont j'ai besoin. Il ne me donnera pas d'informations sur la méthode de la classe - cela me donnera des informations sur la méthode de l'interface. Vous affirmez simplement que la classe implémente l'interface. –

Questions connexes