Отсутствует MethodInfo для перегруженной функции с другим типом возврата - PullRequest
2 голосов
/ 15 января 2011

У меня есть класс, определенный следующим образом

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) я не получаю MethodInfo для функции ITest.Find.Каков наилучший способ получить MethodInfo для отсутствующего метода?

Спасибо

Ответы [ 4 ]

1 голос
/ 15 января 2011

Я думаю, что вы имеете в виду следующую подпись для первого Find метода:

public T Find<T>(int i) { return default(T); }

(Ваше существующее объявление не компилируется; оно имеет two return-types)

Я думаю, что ваша проблема в том, что по умолчанию GetMethods не возвращает явно реализованные методы интерфейса, которые являются закрытыми.Тем не менее, он должен хорошо работать с этими BindingFlags:

BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance

Если вы хотите только два Find метода (и ни один из унаследованных), добавьте BindingFlags.DeclaredOnly.

Например

static void Main(string[] args)
{
    var flags = BindingFlags.NonPublic | BindingFlags.Public |
                BindingFlags.Instance  | BindingFlags.DeclaredOnly;

    foreach(var method in typeof(Test).GetMethods(flags))
         Console.WriteLine(method);
}

Выход :

T Find[T](Int32)
System.Collections.Generic.List`1[T] Program.ITest.Find[T](Int32)
1 голос
/ 15 января 2011

Ваш явно реализованный метод ITest.Find является приватным.Вам нужно будет использовать BindingFlags в вызове GetMethods:

        var methods = typeof(Test).GetMethods(BindingFlags.Public |
                         BindingFlags.NonPublic | BindingFlags.Instance);
0 голосов
/ 15 января 2011

Вы можете использовать Type.GetInterfaces, чтобы получить все интерфейсы, реализованные типом, поэтому следующие методы должны получить все методы:

Type t = typeof(Test);

IEnumerable<MethodInfo> methods = t.GetMethods()
    .Concat(t.GetInterfaces().SelectMany(i => i.GetMethods()));
0 голосов
/ 15 января 2011

Вы можете использовать Type.GetInterface, убедиться, что возвращаемое значение не равно нулю, а затем использовать отражение для него, чтобы получить тип.Например:

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]

РЕДАКТИРОВАТЬ:

Хотя ответ Ани, кажется, решает это для вас без необходимостиприбегнуть к тому, что предлагается здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...