@Naf2000

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

Как имея информацию о методе B.Test достучаться до базового метода A.Test, если возвращаемый тип у переопределяемого метода "сужен"? Возвращает информацию о себе (видимо из-за изменения сигнатуры), если тип не менять - то все хорошо. Естественно метод ведет себя полиморфно, но непонятно как получить базовый класс.
using System;
class HelloWorld {
  static void Main() {
    Console.WriteLine(typeof(B).GetMethod(nameof(B.Test)).GetBaseDefinition().ReflectedType);
    Console.WriteLine(typeof(B).GetMethod(nameof(B.Test)).GetBaseDefinition().DeclaringType);
    A a = new B();
    Console.WriteLine(a.Test());
  }
}

class A
{
    public virtual A Test()=> new A();
}

class B :A
{
    public override B Test()=> new B();
}
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы