C# 从扁平接口层次结构中获取成员
可能重复:C# 从扁平接口层次结构中获取成员,c#,reflection,C#,Reflection,可能重复: 在尝试从接口接收有关所有方法的信息时,我首先尝试了以下操作: interface IBaseInterface { void SomeMethod(); } interface ISomeInterface : IBaseInterface {} Type interfaceType = typeof( ISomeInterface ); BindingFlags allInstanceMembers = BindingFlags.FlattenHierarchy |
在尝试从接口接收有关所有方法的信息时,我首先尝试了以下操作:
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 );
这将导致一个空的方法数组
我认为问题在于扁平化层次结构不适用于接口,但我不确定。在尝试使用实现之前,如果有人能够确认或解释我做错了什么,那就太好了。
flatthierarchy
只影响具体类型中的静态方法:
发件人:
指定BindingFlags.FlatterHierarchy以包括层次结构中的公共和受保护静态成员;继承类中的私有静态成员不包括在内
实际上,您必须使用
GetInterfaceMap()
和/或自己迭代层次结构中的所有接口。flatteHierarchy
仅影响具体类型中的静态方法:
发件人:
指定BindingFlags.FlatterHierarchy以包括层次结构中的公共和受保护静态成员;继承类中的私有静态成员不包括在内
实际上,您必须使用
GetInterfaceMap()
和/或自己迭代层次结构中的所有接口。我建议您签出一个库,该库旨在使反射更容易、更快(但后者不适用于查找)
要查找所有实例成员,只需执行以下操作:
var methods = typeof(ISomeInterface).Methods( Flags.InstanceAnyVisibility );
默认情况下,Fasterflect将使层次结构扁平化,因此不需要特殊代码来包含基本接口成员(查找是递归的,不包括对象成员)。我建议签出一个库,该库旨在使反射更容易、更快(但后者不适用于查找) 要查找所有实例成员,只需执行以下操作:
var methods = typeof(ISomeInterface).Methods( Flags.InstanceAnyVisibility );
默认情况下,Fasterflect将使层次结构扁平化,因此不需要特殊代码来包含基本接口成员(查找是递归的,不包括对象成员)。谢谢,该库似乎完成了我已经编写的许多类似的工作:/@史蒂文:如果你有我们没有的东西,请随时加入并做出贡献。。或者仅仅满足于免费维护;)PS:我是赛义德图书馆的撰稿人。每次我读到这个名字,我都觉得是“Fastreflect”拼错了:)@Joel lol,也许这就是1.0的名字,在它变得更快之前;)@莫顿:我会检查一下,看看是否有兴趣将我发现缺少的功能(如果有的话)合并到这个库中。一段时间以来,我一直在考虑将所有反射代码拆分为一个单独的项目,使用现有的项目更有意义;p感兴趣的时候,我已经在我的博客上描述了。谢谢,那个图书馆似乎做了很多我已经写过的类似的事情/@史蒂文:如果你有我们没有的东西,请随时加入并做出贡献。。或者仅仅满足于免费维护;)PS:我是赛义德图书馆的撰稿人。每次我读到这个名字,我都觉得是“Fastreflect”拼错了:)@Joel lol,也许这就是1.0的名字,在它变得更快之前;)@莫顿:我会检查一下,看看是否有兴趣将我发现缺少的功能(如果有的话)合并到这个库中。一段时间以来,我一直在考虑将所有反射代码拆分为一个单独的项目,使用现有的项目更有意义;p感兴趣的时候,我已经在我的博客上描述过了。