从扁平化的界面层次结构中获取成员

时间:2011-06-04 23:58:41

标签: c# reflection

  

可能重复:
  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进行实施之前,如果有人能够确认或解释我做错了什么,那就太好了。

2 个答案:

答案 0 :(得分:1)

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

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

  

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

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

答案 1 :(得分:1)

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

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

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

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