Question Héritage de l'interface C #


Donné:

public interface IA
{
    void TestMethod();
}

public interface IB : IA
{
}

Pourquoi:

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

?

Juste pour être clair:

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

public class B : A
{
}

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

fonctionne (il retourne 5);

En bonus:

typeof(IB).BaseType == null

16
2017-08-03 09:25


origine


Réponses:


Voici le code pour obtenir les comptes à la fois pour 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ù je voudrais utiliser ceci, je ne peux pas supposer que je vais toujours avoir au moins une interface.

J'ai également essayé les indicateurs de liaison comme suit:

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

Cependant, cela restera toujours 0 comme interface IB ne met toujours pas en œuvre la méthode TestMethod(). Interface IA Est-ce que. 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!


11
2017-08-03 09:47



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 souhaitez découvrir toutes les méthodes, vous devez interroger directement chaque type d'interface.

Découvrez la section du contenu de la communauté de cet article MSDN.


9
2017-08-03 09:33



Considérer IA comme une interface de IB, pas sa base.


2
2017-08-03 10:09



Vous devez définir des Bindingflags dans GetMethods ().

Essayer

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

-1
2017-08-03 09:32