Я хочу получить метод из определенного интерфейса, но он может быть в нескольких интерфейсах. Я пишу этот код: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) });
...
И теперь это работает.
Почему первый вариант не работает?
Хорошо, спасибо, что ответит. Но тогда, какой метод может удовлетворить мои потребности? Этот способ выглядит уродливым –
Не знаете, что вам нужно. См. [Как получить метод MethodInfo метода интерфейса, реализующий MethodInfo метода класса?] (Http://stackoverflow.com/questions/1113635/how-to-get-methodinfo-of-interface-method-having-implementing-methodinfo -of-CLA). – CodeCaster
Я хочу получить метод из универсального интерфейса, только если он не существует в generic. Единственный способ, который я нашел, - это просто позвонить GetMethod два раза, но это уродливое из-за копирования и вставки. –