2010-08-03 15 views
16

Teniendo en cuenta:C# interface herencia

public interface IA 
{ 
    void TestMethod(); 
} 

public interface IB : IA 
{ 
} 

qué:

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

?

Para que quede claro:

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

public class B : A 
{ 
} 

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

hace el trabajo (que devuelve 5);

Como beneficio adicional:

typeof(IB).BaseType == null 

Respuesta

-1

Usted tiene que definir algunos BindingFlags en getMethods().

Trate

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

He omitido BindingFlags porque no están ayudando;). – ppiotrowicz

+1

Las banderas de encuadernación no ayudan en este caso. Ellos ayudan cuando las clases están involucradas. – Manfred

9

Este parece ser el diseño de la función getMethods. No admite miembros heredados en las interfaces. Si desea descubrir todos los métodos, necesita consultar cada tipo de interfaz directamente.

Echa un vistazo a la sección de contenido de la comunidad de this MSDN article.

11

Este es el código para obtener los conteos tanto para IA y IB:

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

Nótese que en el código de producción que no usaría GetInterfaces()[0] como típicamente en el código donde yo usaría esto no puedo Supongo que siempre tendré al menos una interfaz.

También probamos el BindingFlags de la siguiente manera:

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

Sin embargo, esto todavía devolverá 0 como interfaz IB todavía no implementa el método TestMethod(). La interfaz IA hace. El uso de banderas de enlace funcionaría si las clases fueran IA y IB. Sin embargo, en ese caso, obtienes un valor de retorno de 5. ¡No olvides que IA deriva implícitamente de la clase Object!

+0

Gracias por esa respuesta. Sé que puedo iterar sobre las interfaces y obtener métodos de ellas. Mi pregunta era por qué no puedo hacerlo de esa manera. – ppiotrowicz

2

Considere que IA es una interfaz de IB, no su base.