Indeed - there's no silver bullet, and a pragmatic approach is always preferred :)
Btw, in the article I linked, I don't move the conditionals anywhere. There is none.
I use dynamic type discovery to find command handlers at application startup, placing them in a dictionary I pass on to a dispatcher class.
All types are registered with the DI container.