Чисто вопрос интереса ради. Возможно ли вызвать метод старее чем предок из потомка? Чтонибудь типа
(КлассПраПраДедушка)base.МетодКласса()
или
base.base.МетодКласса()
Конечно.
Например, так:
КлассПраПраДедушка grandpa = this;
grandpa.МетодКласса();
Ну или просто ((КлассПраПраДедушка)this).МетодКласса();
Если МетодКласса не перекрыт при помощи new, то можно, разумеется, просто МетодКласса();.
Синтаксиса, подобного base, для спуска дальше вниз по иерархии, нету. То есть, вам нужно указать точный тип предка.
Как правильно подсказывает @AntonShchyrov, для случая виртуального переопределённого метода, вызвать метод метод предка дальше, чем base, средствами языка невозможно.
Можно сделать грубый хак через рефлексию:
class Grandpa
{
public virtual void Do() => Console.WriteLine("Grandpa.Do");
}
class Father : Grandpa
{
public override void Do() => Console.WriteLine("Father.Do");
}
class Child : Father
{
public void CallGrandpa()
{
((Action)Activator.CreateInstance(
typeof(Action),
this,
typeof(Grandpa).GetMethod("Do").MethodHandle.GetFunctionPointer())).Invoke();
}
}
Никогда не делайте так. О причинах, почему плохо вызывать что попало, говорит Эрик Липперт здесь.
Прямой вызов через рефлексию не работает, и вызывает в реальности переопределённый метод. Хитрость с MethodHandle.GetFunctionPointer() позаимствована отсюда.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости