2010-08-03 10 views
16

Dato:C# interfaccia eredità

public interface IA 
{ 
    void TestMethod(); 
} 

public interface IB : IA 
{ 
} 

Perché:

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

?

Giusto per essere chiari:

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

public class B : A 
{ 
} 

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

funziona (si restituisce 5);

Come bonus:

typeof(IB).BaseType == null 

risposta

-1

Bisogna definire alcuni BindingFlags in GetMethods().

Prova

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

Ho ommited BindingFlags perché non stanno aiutando;). – ppiotrowicz

+1

I flag di binding non sono di aiuto in questo caso. Aiutano quando sono coinvolte le classi. – Manfred

9

Questo sembra essere il design della funzione GetMethods. Non supporta i membri ereditati nelle interfacce. Se si desidera scoprire tutti i metodi, è necessario interrogare ogni tipo di interfaccia direttamente.

Controlla la sezione del contenuto della community di this MSDN article.

11

Ecco il codice per ottenere i conteggi per entrambi IA e IB:

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

Si noti che nel codice di produzione non userei GetInterfaces()[0] come tipicamente nel codice in cui vorrei utilizzare questo non posso Supponiamo che avrò sempre almeno un'interfaccia.

Ho anche provato la BindingFlags come segue:

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

Tuttavia, questo restituirà ancora 0 come interfaccia IB ancora non implementa il metodo TestMethod(). Interfaccia IA fa. L'utilizzo di flag di associazione funzionerebbe se entrambe le classi IA e IB fossero classi. In tal caso, tuttavia, si ottiene un valore restituito pari a 5. Non dimenticare che IA deriva implicitamente dalla classe Object!

+0

Grazie per questa risposta. So che posso scorrere le interfacce e ottenere metodi da loro. La mia domanda era perché non posso farlo in quel modo. – ppiotrowicz

2

Considerare IA come un'interfaccia di IB, non la sua base.