I was looking for a way to refactor and simplify one function where I have to do data sorting depending on input class type, and got stuck at switch(input.GetType()):<
It seems you don't expect the switch to match on subclasses. But this would break the Liskov Substitution Principle. (where if you passed in a C object, the code would work, but not with a D, even though D is a subclass of C).
I think it's a perfectly valid argument on Peter Hallam's blog post that you don't expect switch statement to differ if you reorder things, so it's really only useful if only one branch can be valid at the same time, whereas with Type one class is always multiple different types along the inheritance chain.
No one stops you from doing this with an if...else chain, where you do expect it to be evaluated in the order you put things.