Иерархия классов для интерфейсов C # - PullRequest
5 голосов
/ 26 февраля 2010

Я поиграюсь с некоторыми классами и интерфейсами и разработал простой метод определения иерархии классов, то есть определения цепочки наследования.

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);
}

Итак, для

OutputClassHierarchy(typeof(System.Exception));

Я получаю вывод:

System.Exception: System.Object

System.Object: Base

Что я и ожидаю.

Но, если я попытаюсь сделать то же самое с интерфейсом, который реализует другой интерфейс, т.е.

interface IMyInterface : IDisposable
{
    void Hello();
}

...

OutputClassHierarchy(typeof(IMyInterface));

Я получаю вывод:

MyNameSpace.IMyInterface: Base

Итак, что здесь происходит? Можно ли вывести иерархию интерфейсов, как заявлено выше, или нет такой вещи, когда дело касается интерфейсов?

Кроме того, где System.Object во всем этом? Я думал, что все было построено на этом.

Ответы [ 2 ]

4 голосов
/ 26 февраля 2010

Интерфейс не имеет базового типа single , поскольку он может реализовывать несколько других интерфейсов, например,

public IMyInterface : IDisposable, IComponent

Однако вы можете получить доступ к этим интерфейсам, используя метод GetInterfaces:

var interfaces = typeof(IMyInterface).GetInterfaces();
4 голосов
/ 26 февраля 2010

Интерфейсы не являются производными от Object, поэтому он не будет отображаться при выводе его базы. Вот комментарий Эрика Липперта о вещах, которые происходят от Object (и вещах, которые можно преобразовать в Object).

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

Этот ответ SO может помочь ответить на ваш вопрос об интерфейсах, содержащих другие интерфейсы:

Как получить базовый тип интерфейса с помощью отражения?

Интерфейсы содержат другие интерфейсы, они не являются производными от них, поэтому не будут отображаться при поиске его базового типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...