В объектно-ориентированных языках такого рода операторы if / else или switch, основанные на классе, решаются с использованием полиморфизма. Если doSomething () находится в выражении Foo, компилятор знает, что независимо от типа времени выполнения метод определен для любого дочернего элемента Foo.
Тогда, если вы знаете, что foo - это Foo, Bar или Baz, вы на самом деле должны использовать только foo.doSomething (), без проверки типов и без приведения.
Единственное, что вам нужно знать, это проверить, что foo это Foo, убедитесь, что вы используете type, а не var или dynamic:
void doSomething(dynamic foo){
if (foo is Foo) {
foo.doSomething(); //Ok with Foo Bar or baz
}
foo.doSomething(); //Possible runtime error since foo can be anything
}
Поскольку дротик типизирован, рекомендуется использовать типы, а не динамические, и вы можете написать прямо что-то вроде:
void doSomething(Foo foo){ //Making sure that you will work with a Foo
foo.doSomething(); //Ok with Foo Bar or baz with no check
}