C#反射:GetMethods(..)无法检索任何内容

时间:2013-12-19 08:10:06

标签: c# reflection interface

我目前正在尝试获取一组非常具体的方法,但我没有这样做。 我需要获得与实现特定接口的所有类中的特定签名匹配的所有方法。

到目前为止我得到的是:

IEnumerable<System.Type> classes = Assembly.GetAssembly(typeof(IActionMethod)).GetTypes().Where(x => x.GetInterface("IActionMethod") != null);
MethodInfo[] methods;
List<MethodInfo> relevant;
ParameterInfo[] parameters;
foreach(System.Type cls in classes)
{
    methods = cls.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);
    relevant.Clear();
    for(int i = 0; i < methods.Length; i++)
    {
        parameters = methods[i].GetParameters();
        if(parameters.Length == 1 && parameters[0].GetType() == typeof(GameObject) && methods[i].ReturnType == typeof(void))
            relevant.Add(methods[i]);
    }
}

此代码已在GetMethods(..)失败,但未返回任何方法。 我不明白的是,如果没有实现接口,我可以接收任何相关类的所有公共方法。

界面本身不包含任何内容,我只是用它来“标记”相关的类,因为我无法提出任何其他解决方案。

任何人都可以告诉我为什么界面渲染GetMethods没用或指向上面代码中的错误?

3 个答案:

答案 0 :(得分:8)

我怀疑这是问题所在:

foreach(System.Type cls in classes)
{    
    methods = cls.GetType().GetMethods(...)

cls已经是Type,因此在其上调用GetType()将返回System.Type(或子类)。我怀疑你只是想要:

foreach(System.Type cls in classes)
{    
    methods = cls.GetMethods(...)

还不清楚为什么要在每次迭代时清除relevant列表。这意味着最后的条目将是您查看的最后一个课程中的条目 - 您确定这是您想要的吗?

答案 1 :(得分:3)

另外,Microsoft recommends不使用'标记接口',而是建议使用属性。然后,您可以use Memberinfo.IsDefined()而不是检查界面。

答案 2 :(得分:1)

要查找实现特定接口的所有类,您应该使用IsAssignableFrom,因为您的代码将省略间接实现您的接口的类:

 Type interfaceType = typeof(IActionMethod);
 Assembly assembly = Assembly.GetAssembly(interfaceType );
 IEnumerable<System.Type> classes = assembly.GetTypes().Where(x => interfaceType.IsAssignableFrom(x));

然后,您可能想要致电:

 methods = cls.GetMethods(...)

因为cls是您想要的类型,您目前正在Type进行搜索。