Код в вопросе должен делать то, что вы хотите, однако, как писал Дэнни Гудбол в своем комментарии, это очень плохая практика.
Согласно принципу открытия / закрытия , утверждающему, что «программные объекты (классы, модули, функции и т. Д.) Должны быть открыты для расширения, но закрыты для модификации»,
Правильный способ обработки различных действий для разных детей - использовать переопределение:
Сделайте метод виртуальным (может быть, даже лучше, как абстрактный метод) и переопределите его в каждом производном классе с его собственной реализацией:
class A
{
virtual void CheckDerived() { throw new NotImplementedException(); }
}
class A0 : A
{
void override CheckDerived() { Console.WriteLine("A0"); }
}
class A1 : A
{
void override CheckDerived() { Console.WriteLine("A1"); }
}