Я пытаюсь определить, является ли текущий класс реализует любые методы с той же сигнатурой, как объект 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?
Поскольку ограничений нет, T и int являются соблюдением, и вы не должны проверять типы для неактуальной (истинной/ложной) проверки? – Turbot