Как через рефлексию получить базовый метод, если сигнатура в переопределенном методе изменена?

Чтобы получить базовый метод через рефлексию в C# в случае, когда сигнатура переопределенного метода изменена, можно воспользоваться механизмом рефлексии, который позволяет исследовать и модифицировать типы во время выполнения.

Для начала, необходимо получить тип класса, в котором находится переопределенный метод. Для этого можно использовать метод GetType(), примененный к экземпляру объекта этого класса, либо статический метод typeof(), передав в него сам класс. Например:

Type type = typeof(ClassName);

Затем, используя полученный тип, можно получить информацию о методе с измененной сигнатурой. Для этого используется метод GetMethod(), в который передается имя переопределенного метода и массив типов аргументов новой сигнатуры.

MethodInfo overriddenMethod = type.GetMethod("MethodName", new Type[] { typeof(NewArgumentType) });

В приведенном коде MethodName - это имя переопределенного метода, а NewArgumentType - это новый тип аргумента в сигнатуре метода.

Дальше необходимо получить базовый метод с оригинальной сигнатурой. Для этого используется свойство MethodInfo.BaseDefinition, которое возвращает базовую реализацию переопределенного метода:

MethodInfo baseMethod = overriddenMethod.GetBaseDefinition();

Теперь в переменной baseMethod содержится информация о базовом методе с оригинальной сигнатурой.

Пример полного кода, демонстрирующего получение базового метода в случае изменения сигнатуры:

public class BaseClass
{
    public virtual void MethodName(int arg)
    {
        // Базовая реализация метода
    }
}

public class DerivedClass : BaseClass
{
    public override void MethodName(string arg)
    {
        // Новая реализация метода
    }
}

public class Program
{
    public static void Main()
    {
        DerivedClass derived = new DerivedClass();
        Type type = derived.GetType();
        // или можно так: Type type = typeof(DerivedClass);

        MethodInfo overriddenMethod = type.GetMethod("MethodName", new Type[] { typeof(string) });
        MethodInfo baseMethod = overriddenMethod.GetBaseDefinition();

        Console.WriteLine("Базовый метод: " + baseMethod.Name);
    }
}

В данном примере получаем базовый метод MethodName, который определен в базовом классе BaseClass, даже если в производном классе DerivedClass метод переопределен с измененной сигнатурой.

В результате выполнения кода будет выведено "Базовый метод: MethodName".

Таким образом, используя рефлексию в C#, мы можем получить информацию о базовом методе в случае, когда его сигнатура изменена в переопределенном методе.