代码之家  ›  专栏  ›  技术社区  ›  Mutation Person

接口C的类层次结构#

  •  5
  • Mutation Person  · 技术社区  · 15 年前

    我正在处理一些类和接口,并开发了一个简单的方法来确定类的层次结构,即识别继承链。

    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:基础

    这就是我所期望的。

    但是,如果我尝试使用实现另一个接口的接口,也就是说,

    interface IMyInterface : IDisposable
    {
        void Hello();
    }
    
    ...
    
    OutputClassHierarchy(typeof(IMyInterface));
    

    我得到输出:

    mynamespace.imyinterface:基

    那么,这是怎么回事?是否可以按照上面的声明推断接口层次结构,或者在接口方面是否没有这样的东西?

    还有,哪里是 System.Object 在这一切中?我以为一切都是建立在它之上的。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    7 年前

    接口不是从对象派生的,因此在输出对象的基时,它不会显示出来。下面是EricLippert对从对象派生的东西(以及可转换为类型对象的东西)的评论。

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

    此答案可能有助于回答有关包含其他接口的接口的问题:

    How to get interface basetype via reflection?

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

        2
  •  4
  •   Mark Seemann    15 年前

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

    public IMyInterface : IDisposable, IComponent
    

    但是,您可以通过使用 GetInterfaces 方法:

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