Ответ Джона Скита, безусловно, завершает работу, но мне, например, не очень нравится реализация. Я предпочитаю следующее, что делает это - по моему мнению - простым.
В любом случае .NET уже поддерживает эту функцию с помощью виртуальных методов.
public class Vehicle {
public virtual void Go() {
Log(this.GetType().Name);
}
}
public class Car : Vehicle {
public override void Go() {
base.Go();
// Do car specific stuff
}
}
public class Bus : Vehicle {
}
Это будет работать, если вы ссылаетесь на экземпляр по его базовому классу или по фактическому классу. Это не вынуждает вас менять реализацию в базовых предложениях и ... все остальные объектно-ориентированные особенности .NET.
Если у вас есть полный контроль над реализацией базовых и производных классов, то эта реализация должна хорошо вам служить.