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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Нюанс в том, что возможность сузить возвращаемый тип в наследниках - это синтаксический сахар.
    На самом деле в классе B объявлено два метода (грубо говоря):
    1. public virtual B Test() => new B(); DeclaringType = B
    2. public override A Test() => (A) this.Test(); DeclaringType = A

    Чтобы получить именно тот, который DeclaringType = A следует искать метод не только по имени, но и по возвращаемому типу. К сожалению, GetMethod так не умеет:
    Console.WriteLine(typeof(B).GetMethods().Where(x=>x.Name == nameof(B.Test)).Where(x=>x.ReturnType == typeof(A)).GetBaseDefinition().DeclaringType);//A
    Ответ написан
    Комментировать