为什么继承接口的成员不能使用反射?

dri*_*iis 4 c# reflection

在反映接口类型时,我只获取特定类型的成员,而不是继承成员.

在这个过于简化的例子中,程序只打印"Name",而不是"ItemNumber","Name",正如我所料:

using System;

public interface IBasicItem
{
    string ItemNumber { get; set; }
}

public interface IItem : IBasicItem
{
    string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var type = typeof (IItem);
        foreach (var prop in type.GetProperties())
            Console.WriteLine(prop.Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

这背后的理由是什么?当我从基接口继承时,我说我的接口的任何实现,也必须实现继承的成员.换句话说,IItem 是一个 IBasicItem.那么为什么继承的成员不会出现反射?

blu*_*blu 10

我认为这正是Phil Haack刚刚发表的博客.

从ECMA-335公共语言基础结构规范:

8.9.11接口类型派生接口类型可能需要实现一个或多个其他接口.任何实现对接口类型的支持的类型还应实现对该接口指定的任何所需接口的支持.这与对象类型继承有两种不同:

  • 对象类型形成单个继承树; 接口类型没有.
  • 对象类型继承指定如何继承实现; 必需的接口没有,因为接口没有定义实现.必需的接口指定实现对象类型应支持的其他合同.

要突出显示最后的差异,请考虑具有单个方法的接口IFoo.从中派生的接口IBar要求支持IBar的任何对象类型也支持IFoo.它没有说明IBar本身将拥有哪些方法.

参考自:http: //haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx


Eri*_*ert 6

考虑这个问题的一个好方法是接口不像类那样具有"继承".继承意味着"是一种"关系,但界面"继承"实际上暗示了"需要提供此服务"的关系.

当我们说

interface IEnumerator<T> : IDisposable
Run Code Online (Sandbox Code Playgroud)

我们所说的并不是"序列普查员是一种一次性的东西","如果您提供调查员服务,那么您必须提供处置服务".

这现在更有意义吗?