2015-12-21 4 views
0

Я пытаюсь определить, является ли текущий класс реализует любые методы с той же сигнатурой, как объект MethodInfo, что я получаю проходил в. (Его RealProxy махинаций)Сравните общего метод подпись равенство

Так что я имею реализован этот метод для проверки, если два (возможно, вложенными, общие) типы равны:

Func<Type, Type, bool> checkTypesEqual = null; 
checkTypesEqual = (t1, t2) => 
{ 
    if (t1.IsGenericType && t2.IsGenericType) 
    { 
     if (t1.GetGenericTypeDefinition() != t2.GetGenericTypeDefinition()) 
      return false; 
     var t1args = t1.GetGenericArguments(); 
     var t2args = t2.GetGenericArguments(); 
     if (t1args.Length != t2args.Length) 
      return false; 
     for (int i = 0; i < t1args.Length; i++) 
     { 
      if (!checkTypesEqual(t1args[i], t2args[i])) 
       return false; 
     } 
     return true; 
    } 
    return t1 == t2; 
}; 

при том, что я проверить, что тип возвращаемого значения одинаковы, и все типы параметров также одинаковы.

Теперь рассмотрим следующий код:

var t11 = typeof (Task<Func<string, int>>); 
var t22 = typeof (Task<Func<string, int>>); 
bool eq = checkTypesEqual(t11, t22); 

eq будет истинным в этой ситуации, метод работает правильно.

Однако, если у вас есть метод, который имеет общий параметр, это будет больше похоже на ввод следующий:

var t11 = typeof (Task<Func<string, int>>); 
var t22 = typeof (Task<Func<string, T>>); 
bool eq = checkTypesEqual(t11, t22); 

Теперь eq будет ложным, потому что T != int, но метод подпись все еще соответствует (там не являются общими ограничениями). Как я могу изменить метод меток проверки для учета этого и вернуть true?

+0

Поскольку ограничений нет, T и int являются соблюдением, и вы не должны проверять типы для неактуальной (истинной/ложной) проверки? – Turbot

ответ

1

Оказалось, что type.IsGenericParameter является собственностью, которую я искал. Поэтому я изменил метод следующим образом, чтобы проверить, является ли один из типов общим параметром, и если так, просто верните true.

Func<Type, Type, bool> checkTypesEqual = null; 
checkTypesEqual = (t1, t2) => 
{ 
    if (t1.IsGenericParameter || t2.IsGenericParameter) // <------- 
     return true; 
    if (t1.IsGenericType && t2.IsGenericType) 
    { 
     if (t1.GetGenericTypeDefinition() != t2.GetGenericTypeDefinition()) 
      return false; 
     var t1args = t1.GetGenericArguments(); 
     var t2args = t2.GetGenericArguments(); 
     if (t1args.Length != t2args.Length) 
      return false; 
     for (int i = 0; i < t1args.Length; i++) 
     { 
      if (!checkTypesEqual(t1args[i], t2args[i])) 
       return false; 
     } 
     return true; 
    } 
    return t1 == t2; 
}; 
Смежные вопросы