2010-02-26 16 views
5

Używam niektórych klas i interfejsów i opracowałem prostą metodę określania hierarchii klasy, tj. Identyfikowania łańcucha dziedziczenia.Hierarchia klas dla interfejsów 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); 
} 

Więc dla

OutputClassHierarchy(typeof(System.Exception)); 

mam wyjścia:

System.Exception: System.Object

System.Object: Podstawa

Który jest to, czego się spodziewam.

Ale jeśli próbuję samo z interfejsem, który implementuje inny interfejs, tj

interface IMyInterface : IDisposable 
{ 
    void Hello(); 
} 

... 

OutputClassHierarchy(typeof(IMyInterface)); 

mam wyjścia:

MyNameSpace.IMyInterface: Podstawa

Tak , co tu się dzieje? Czy możliwe jest określenie hierarchii interfejsu, jak zadeklarowano powyżej, czy też nie ma czegoś takiego, jeśli chodzi o interfejsy?

Ponadto, gdzie jest System.Object w tym wszystkim? Myślałem, że wszystko zostało na nim zbudowane.

+1

Wystarczy FYI, masz konsekwentnie błędnie "hierarchia" w całym. Pamiętaj, że zasada brzmi "Ja przed E, chyba że jest inaczej". –

+1

Tam dostajesz Erica. Wszystko naprawione. Czuję się też zobowiązany do wskazania złej pisowni. Jedyne, co denerwuje, to mnie bardziej; jest niepoprawny, interpunkcja ...! –

Odpowiedz

4

Interfejsy nie są wyprowadzane z obiektu, więc nie będą wyświetlane podczas wyprowadzania jego podstawy. Oto komentarz Eric Lipperta na temat rzeczy, które pochodzą z Object (i rzeczy, które można zamienić na typ Object).

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

Ten SO odpowiedź może pomóc odpowiedzieć na pytanie o interfejsach zawierających inne interfejsy:

How to get interface basetype via reflection?

Interfejsy zawierać inne interfejsy, nie czerpią z nich więc nie pokaże w górę, gdy szukasz tego typu bazy.

4

Interfejs nie ma podstawowego typu , ponieważ może zaimplementować kilka innych interfejsów, np.

public IMyInterface : IDisposable, IComponent 

Jednak można dostać w tych interfejsów przy użyciu metody GetInterfaces:

var interfaces = typeof(IMyInterface).GetInterfaces(); 
Powiązane problemy