【问题标题】:Get members from flattened interface hierarchy [duplicate]从扁平化的接口层次结构中获取成员[重复]
【发布时间】:2011-06-04 23:58:41
【问题描述】:

可能重复:
Reflecting over all properties of an interface, including inherited ones?

在尝试从接口接收有关所有方法的信息时,我首先尝试了以下操作:

interface IBaseInterface
{
    void SomeMethod();
}
interface ISomeInterface : IBaseInterface {}

Type interfaceType = typeof( ISomeInterface );
BindingFlags allInstanceMembers = BindingFlags.FlattenHierarchy |
                                  BindingFlags.Instance |
                                  BindingFlags.NonPublic |
                                  BindingFlags.Public;
MethodInfo[] methods = interfaceType.GetMethods( allInstanceMembers );

这会导致一个空的方法数组。

我认为问题是扁平化层次结构不适用于接口,但我不确定。在尝试使用 Type.GetInterfaceMap 实现之前,如果有人能确认或解释我做错了什么,那就太好了。

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    FlattenHierarchy 只影响具体类型中的静态方法:

    来自http://msdn.microsoft.com/en-us/library/4d848zkb.aspx

    指定 BindingFlags.FlattenHierarchy 以在层次结构中包含公共和受保护的静态成员;不包括继承类中的私有静态成员。

    您确实必须使用GetInterfaceMap() 和/或自己简单地遍历层次结构中的所有接口。

    【讨论】:

      【解决方案2】:

      我建议您查看Fasterflect,这是一个旨在使反射更容易和更快的库(尽管后者不适用于查找)。

      要查找所有实例成员,您只需执行以下操作:

      var methods = typeof(ISomeInterface).Methods( Flags.InstanceAnyVisibility );
      

      Fasterflect 默认会展平层次结构,因此不需要特殊代码来包含基本接口成员(查找是递归的,不包括对象成员)。

      【讨论】:

      • 谢谢,那个库似乎做了很多我已经写过的类似的事情。 ://
      • @Steven 如果您有我们没有的东西,请随时加入并做出贡献……或者只是满足于免费维护;) PS:我是上述图书馆的贡献者。
      • 每次我读到这个名字时,我都认为它是“Fastreflect”的拼写错误。 :)
      • @Joel 大声笑,也许那是 1.0 的名称,在它变得更快之前;)
      • @Morten:我会检查一下,看看将我发现缺少的功能(如果有的话)合并到这个库中是否会很有趣。我一直在考虑将所有反射代码拆分到一个单独的项目中,使用现有的会更有意义。 ;p 如果有兴趣,我已经在我的博客上描述了some of my more advanced implementations
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 2016-06-03
      • 2022-01-23
      相关资源
      最近更新 更多