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

时间:2010-01-25 14:10:20

标签: c# reflection

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

例如,给定此层次结构:

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传递给GetProperties,因为我对FlattenHierarchy的理解是它应该包含来自基类的成员,但行为完全相同。

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

我怎么能:

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

2 个答案:

答案 0 :(得分:7)

可以在注释中找到各种答案the .NET framework version 3.5-specific MSDN page on GetProperties(BindingFlags bindingFlags)

  

传递BindingFlags.FlattenHierarchy   到其中一个Type.GetXXX方法,   比如Type.GetMembers,不会   返回继承的接口成员   当你在界面上查询时   打字本身。

     

[...]

     

要获得继承的成员,您需要   查询每个实现的接口   为其成员。

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

答案 1 :(得分:1)

见这里:GetProperties() to return all properties for an interface inheritance hierarchy

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