Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从扁平接口层次结构中获取成员_C#_Reflection - Fatal编程技术网

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感兴趣的时候,我已经在我的博客上描述过了。