接口的类层次结构 C#

5

我正在研究一些类和接口,已经开发出了一种简单的方法来确定一个类的层次结构,即识别继承链。

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

So, for

OutputClassHierarchy(typeof(System.Exception));

我得到了以下输出:

System.Exception:System.Object

System.Object:Base

这正是我所期望的。

但是,如果我尝试使用实现另一个接口的接口进行相同的操作,即:

interface IMyInterface : IDisposable
{
    void Hello();
}

...

OutputClassHierarchy(typeof(IMyInterface));

我得到了以下输出:

MyNameSpace.IMyInterface : Base

所以,这里发生了什么?是否可能推断出上面声明的接口层次结构,或者在涉及接口时不存在这样的东西?
此外,在所有这些内容中,System.Object在哪里?我认为一切都是建立在它之上的。

1
只是提醒一下,你一直拼错了“hierarchy”的单词。记住规则是“I before E except when it's the other way”。 - Eric Lippert
1
你在这里找到了Eric。一切都修好了。我觉得有必要指出拼写错误。唯一让我更烦恼的是错误的标点符号...! - James Wiseman
2个回答

4

接口没有一个单一的基类型,因为它可以实现多个其他接口,例如:

public IMyInterface : IDisposable, IComponent

然而,您可以使用 GetInterfaces 方法来获取这些接口:

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

4

接口不是从Object派生的,所以当你输出它的基类时,它不会显示出来。以下是Eric Lippert关于从Object派生的东西(以及可转换为Object类型的东西)的评论。

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

这个SO答案可能有助于回答你关于包含其他接口的接口的问题:

如何通过反射获取接口基类型?

接口包含其他接口,它们不从中派生,因此在查找其基类型时不会显示出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接