缺少具有不同返回类型的重载函数的MethodInfo

时间:2011-01-14 21:36:04

标签: c# reflection

我有一个如下定义的类

interface ITest   
{  
   List<T> Find<T>(int i);   
}

class Test: ITest  
{  
    public T List<T> Find<T>(int i) { return default(T); }  
    List<T> ITest.Find<T>(int i) { return null; }  
}

当我使用typeof(Test).GetMethods()(有和没有适当的BindingFlags)时,我没有获得ITest.Find函数的MethodInfo。获取缺少方法的MethodInfo的最佳方法是什么?

由于

4 个答案:

答案 0 :(得分:1)

您明确实施的ITest.Find方法是私有的。您需要在GetMethods调用中使用BindingFlags:

        var methods = typeof(Test).GetMethods(BindingFlags.Public |
                         BindingFlags.NonPublic | BindingFlags.Instance);

答案 1 :(得分:1)

答案 2 :(得分:0)

您可以使用Type.GetInterface,确保返回值不为null,然后在其上使用反射来获取类型。例如:

var @class = typeof(Test);      
var methods = @class.GetMethods();      
PrintMethods("Test", methods);      

methods = @class.GetInterface("ITest", true).GetMethods();
PrintMethods("ITest", methods); 

static void PrintMethods(string typeName, params MethodInfo[] methods)
{
    Console.WriteLine("{0} methods:", typeName);
    foreach(var method in methods)
    {
        Console.WriteLine("{0} returns {1}", method.Name, method.ReturnType);
    }   
}

输出(除非我的分隔空间):

Test methods:
Find returns T
ToString returns System.String
Equals returns System.Boolean
GetHashCode returns System.Int32
GetType returns System.Type

ITest methods:
Find returns System.Collections.Generic.List`1[T]

编辑:

虽然Ani的答案似乎可以为你解决这个问题而不必采取这里建议的方式。

答案 3 :(得分:0)

您可以使用Type.GetInterfaces来获取某个类型实现的所有接口,因此以下内容应该包含所有方法:

Type t = typeof(Test);

IEnumerable<MethodInfo> methods = t.GetMethods()
    .Concat(t.GetInterfaces().SelectMany(i => i.GetMethods()));