代码之家  ›  专栏  ›  技术社区  ›  Joe White

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

  •  14
  • Joe White  · 技术社区  · 15 年前

    我有一个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() --回来的只是子属性。

    我试过了 BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy 对于getproperties,因为我对flattenhierarchy的理解是它应该包括来自基类的成员,但是行为是完全相同的。

    我想我可以重复一下 Type.GetInterfaces() 并对每一个调用getproperties,但随后我将依赖接口上的getproperties 从未 返回基本属性(因为如果有,我会得到重复的属性)。我宁愿不依赖这种行为,至少在没有看到记录的情况下。

    我怎样才能:

    • 获取一个接口上所有属性的列表,包括来自它的基本接口的属性?或
    • 至少要有信心,我看到的是我可以依赖的有文档记录的行为,所以我可以解决它?
    2 回复  |  直到 10 年前
        1
  •  7
  •   AakashM    10 年前

    答案是在 注释 the .NET framework version 3.5-specific MSDN page on GetProperties(BindingFlags bindingFlags) :

    传递bindingFlags.flattenHierarchy 到type.getxxx方法之一, 如type.getmembers,将不会 返回继承的接口成员 在查询接口时 类型本身。

    […]

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

    还包括示例代码。这条评论是由微软发布的,所以我想说你可以相信。

        2
  •  1
  •   Community CDub    8 年前

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

    我认为不按您的建议(即获取所有实现接口)就无法获取所有成员。