Я играю вокруг с некоторыми классами и интерфейсами, и разработал простой метод определить иерархию класса, т.е. определить цепочку наследования.
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));
Я получаю вывод:
Система. Исключение: система. Объект
Система. Объект: основа
Который является тем, что я ожидаю.
Но, Если я делаю попытку того же с Интерфейсом, который реализует другой интерфейс, т.е.
interface IMyInterface : IDisposable
{
void Hello();
}
...
OutputClassHierarchy(typeof(IMyInterface));
Я получаю вывод:
MyNameSpace. IMyInterface: основа
Так, что продолжается здесь? Действительно ли это возможно вывести интерфейсную иерархию, как объявлено выше или не является там такой вещью когда дело доходит до интерфейсов?
Кроме того, где System.Object
во всем этом? Я думал, что все было создано на нем.
Интерфейсы не являются производными от Object, поэтому это не отобразится при выводе его базы. Вот комментарий Эрика Липперта о вещах, производных от Object (и вещах, преобразуемых в тип Object).
http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx
Этот ответ SO может помочь ответить на ваш вопрос об интерфейсах, содержащих другие интерфейсы:
Как получить базовый тип интерфейса через отражение?
Интерфейсы содержат другие интерфейсы, но они не являются производными от них, поэтому он не будет отображаться при поиске его базового типа.
интерфейс не имеет единственный основной тип, поскольку он мог осуществить несколько других интерфейсов, например,
public IMyInterface : IDisposable, IComponent
Однако вы можете достигнуть те интерфейсы при помощи метод GetInterfaces
:
var interfaces = typeof(IMyInterface).GetInterfaces();