反映接口的所有属性,包括inheritance的属性?

我有一个表示接口的System.Type实例,我想获得该接口上所有属性的列表 – 包括从基接口inheritance的那些属性。 我基本上希望从类获得的接口中获得相同的行为。

例如,给定此层次结构:

public interface IBase { public string BaseProperty { get; } } public interface ISub : IBase { public string SubProperty { get; } } public class Base : IBase { public string BaseProperty { get { return "Base"; } } } public class Sub : Base, ISub { public string SubProperty { get { return "Sub"; } } } 

如果我在类上调用GetProperties – typeof(Sub).GetProperties() – 那么我同时获得BaseProperty和SubProperty。 我想用接口做同样的事情,但是当我尝试它时 – typeof(ISub).GetProperties() – 所有回来的都是SubProperty。

我试过传递BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy到GetProperties,因为我对FlattenHierarchy的理解是它应该包含来自基类的成员,但行为完全相同。

我想我可以迭代Type.GetInterfaces()并在每个上调用GetProperties,但后来我依赖于接口上的GetProperties 永远不会返回基本属性(因为如果它曾经做过,我会得到重复)。 我宁愿不依赖于这种行为而至少没有记录下来。

我怎么能:

  • 获取接口上所有属性的列表,包括来自其基接口的属性? 要么
  • 至少要确信我所看到的是我可以依赖的记录行为,所以我可以解决它吗?

可以在GetProperties(BindingFlags bindingFlags)上的.NET framework 3.5版特定MSDN页面的注释中找到各种答案GetProperties(BindingFlags bindingFlags)

将BindingFlags.FlattenHierarchy传递给Type.GetXXX方法之一(例如Type.GetMembers),在查询接口类型本身时不会返回inheritance的接口成员。

[…]

要获取inheritance的成员,您需要查询其成员的每个已实现的接口。

示例代码也包括在内。 此评论由Microsoftie发布,所以我想说你可以相信它。

请参见此处: GetProperties()以返回接口inheritance层次结构的所有属性

我不认为有可能让所有成员不按照你的建议(即获得所有实现接口)。