2010-02-26 35 views
5

Estoy jugando con algunas clases e interfaces, y he desarrollado un método simple para determinar la jerarquía de una clase, es decir, para identificar la cadena de herencia.Jerarquía de clases para interfaces C#

public static void OutputClassHierarchy(Type ty) 
{ 
    if (ty.BaseType == null) 
    { 
     Console.WriteLine("{0}: Base", ty); 
     Console.WriteLine(""); 
     return; 
    } 
    Console.WriteLine("{0} : {1}", ty, ty.BaseType); 
    OutputClasshierarchy(ty.BaseType); 
} 

Así, por

OutputClassHierarchy(typeof(System.Exception)); 

consigo la salida:

System.Exception: System.Object

System.Object: Base

Cual es lo que espero

Pero, Si intento lo mismo con una interfaz que implementa otra interfaz, es decir

interface IMyInterface : IDisposable 
{ 
    void Hello(); 
} 

... 

OutputClassHierarchy(typeof(IMyInterface)); 

consigo la salida:

MyNameSpace.IMyInterface: Base

Así , ¿que esta pasando aqui? ¿Es posible inferir la jerarquía de la interfaz como se declaró anteriormente, o no existe tal cosa cuando se trata de interfaces?

Además, ¿dónde está System.Object en todo esto? Pensé que todo estaba construido sobre eso.

+1

Para su información, usted ha escrito mal consistentemente "jerarquía" en todas partes. Recuerde que la regla es "Yo antes que E, excepto cuando es al revés". –

+1

Ahí tienes a Eric. Todo arreglado. Me siento obligado a señalar una mala ortografía también. Lo único que me molesta, yo más; es incorrecto, puntuación ...! –

Respuesta

4

Las interfaces no se derivan de Object, por lo que no se mostrarán cuando se muestre la base del mismo. Aquí está el comentario de Eric Lippert sobre cosas que se derivan de Object (y cosas que son convertibles para escribir Object).

http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx

Este SO respuesta puede ayudar a responder a una pregunta sobre las interfaces que contienen otros interfaces:

How to get interface basetype via reflection?

Interfaces contienen otras interfaces, que no se derivan de ellos por lo que no se mostrará cuando busca su tipo de base.

4

Una interfaz no tiene un tipo de base simple, ya que podría implementar varias otras interfaces, p.

public IMyInterface : IDisposable, IComponent 

Sin embargo, se puede conseguir en esas interfaces utilizando el método GetInterfaces:

var interfaces = typeof(IMyInterface).GetInterfaces(); 
Cuestiones relacionadas