2010-08-03 5 views
16

Vu:C# héritage d'interface

public interface IA 
{ 
    void TestMethod(); 
} 

public interface IB : IA 
{ 
} 

Pourquoi:

typeof(IB).GetMethods().Count() == 0; 

?

Pour être clair:

public class A 
{ 
    public void TestMethod() 
    { 
    } 
} 

public class B : A 
{ 
} 

typeof(B).GetMethods().Count(); 

ne fonctionne (il retourne 5);

En prime:

typeof(IB).BaseType == null 

Répondre

-1

Vous devez définir quelques BindingFlags dans GetMethods().

Essayez

typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count(); 
+3

J'ai bloqué BindingFlags parce qu'ils n'aident pas;). – ppiotrowicz

+1

Les drapeaux de liaison n'aident pas dans ce cas. Ils aident quand les cours sont impliqués. – Manfred

9

Cela semble être la conception de la fonction GetMethods. Il ne prend pas en charge les membres hérités dans les interfaces. Si vous voulez découvrir toutes les méthodes, vous devez interroger chaque type d'interface directement.

Consultez la section du contenu de la communauté de this MSDN article.

11

Voici le code pour obtenir les comptes pour les IA et IB:

var ibCount = typeof(IB).GetMethods().Count(); // returns 0 
var iaCount = typeof (IB).GetInterfaces()[0].GetMethods().Count(); // return 1 

Notez que dans le code de production, je ne voudrais pas utiliser GetInterfaces()[0] comme généralement dans le code où j'utiliser cela, je ne peux pas supposons que j'aurai toujours au moins une interface.

J'ai aussi essayé les BindingFlags comme suit:

const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; 
var ibCount = typeof(IB).GetMethods(bindingFlags).Count(); 

Cependant, cela retournera toujours 0 comme l'interface IB ne fonctionne toujours pas mettre en œuvre la méthode TestMethod(). Interface IA fait. L'utilisation de drapeaux de liaison fonctionnerait si les deux IA et IB étaient des classes. Dans ce cas cependant, vous obtenez une valeur de retour de 5. N'oubliez pas que IA dérive implicitement de la classe Object!

+0

Merci pour cette réponse. Je sais que je peux parcourir les interfaces et obtenir des méthodes de leur part. Ma question était pourquoi je ne peux pas le faire de cette façon. – ppiotrowicz

2

Considérons IA comme une interface de IB, et non comme sa base.