2015-04-30 4 views
1

Я хочу получить метод из определенного интерфейса, но он может быть в нескольких интерфейсах. Я пишу этот код:GetMethod overload возвращает null

private static Expression<Func<T, T, int>> CreateCompareTo<TProperty>(MemberExpression expression, Expression<Func<T, T, int>> result) where TProperty : IComparable<TProperty>, IComparable 
{ 
    var methodInfo = typeof(TProperty).GetMethod("CompareTo", new[] { typeof(IComparable<TProperty>), typeof(IComparable) }); 
    ... 

MSDN

Массив объектов типа, представляющая число, порядок и тип параметров для метода, чтобы получить.

Поэтому я ожидаю, что он будет искать способ через IComparable<T>, и, если ничего не найдено, будет искать его в необщего IComparable. Но это не так. Ну, теперь я переписал его:

private static Expression<Func<T, T, int>> CreateCompareTo<TProperty>(MemberExpression expression, Expression<Func<T, T, int>> result) where TProperty : IComparable<TProperty>, IComparable 
{ 
    Type t = typeof(TProperty); 
    var methodInfo = t.GetMethod("CompareTo", new[] { typeof(IComparable<TProperty>) }) ?? t.GetMethod("CompareTo", new[] { typeof(IComparable) }); 
    ... 

И теперь это работает.

Почему первый вариант не работает?

ответ

4

GetMethod("CompareTo", new[] { typeof(IComparable<TProperty>), typeof(IComparable)})

Поэтому я ожидаю, что он будет искать способ через IComparable, и, если ничего не найдено, будет искать его в необщего IComparable

Нет, он ищет метод с подписью CompareTo(IComparable<TProperty>, IComparable).

Это также в Type.GetMethod() documentation:

поиск указанного открытого метода , параметры которого соответствуют указанным типам аргументов.

+0

Хорошо, спасибо, что ответит. Но тогда, какой метод может удовлетворить мои потребности? Этот способ выглядит уродливым –

+0

Не знаете, что вам нужно. См. [Как получить метод MethodInfo метода интерфейса, реализующий MethodInfo метода класса?] (Http://stackoverflow.com/questions/1113635/how-to-get-methodinfo-of-interface-method-having-implementing-methodinfo -of-CLA). – CodeCaster

+0

Я хочу получить метод из универсального интерфейса, только если он не существует в generic. Единственный способ, который я нашел, - это просто позвонить GetMethod два раза, но это уродливое из-за копирования и вставки. –