Я только что сделал неудачное (по крайней мере для моего приложения) открытие, что два метода, объявленные внутри универсального класса, не имеют одинакового базового определения, продемонстрированного лучше всего в коде:
public static class Test
{
private class Generic<T> { public void Method() { } }
public static void TestBase()
{
var x = typeof(Generic<int>).GetMethod("Method");
var y = typeof(Generic<double>).GetMethod("Method");
Debug.Assert(x.GetBaseDefinition() == y.GetBaseDefinition()); // fails
}
}
И x, и y.IsGeneric имеют значение false, поэтому GetGenericMethodDefinition использовать нельзя.
Единственное решение, которое я смог придумать до сих пор, - это сравнить их имена и то, что их декларирующие типы имеют один и тот же универсальный тип, но при наличии перегрузок, которые кажутся очень хрупкими
Итак ... я не думаю, что есть какой-то полезный метод, который я пропустил в библиотеке отражений, который может сказать мне, были ли эти два метода впервые объявлены в одном и том же классе? Или обходной путь?
EDIT:
Чтобы уточнить, я хочу сделать метод:
public bool DeclaredInSameClass(MethodInfo a, MethodInfo b);
, который возвращает true, если оба a и b оба впервые объявлены в одном и том же классе.
Игнорирование обобщений, это просто: a.GetBaseDefinition() == y.GetBaseDefinition()
, но как обращаться с методами, объявленными в обобщенных классах?