Yes, you can do it on top of it. But it’s quite involved 
In fact, nothing stopping you to have actor methods which simply
accept a single message parameter.
Even polymorphic dispatch works out of the box. So you can have a
higher-order function which accepts some base Message interface.
And then dispatch internally (inside actor) to a more specific
handler by using “dynamic”.
But you'll still need to obtain a reference to an actor by using
some obnoxious static factory, codegened by Orleans MSBuild target.
That’s really ugly and not unit-test friendly, at all.
To overcome this, framework need to do some form of DI.
I hope they fix this in the next release, given we have provided a
lot of feedback on this.
I did some work on message bus for Orleans, and it's started
breezing but still in flux.
I hope to combine Orleans.Bus with Orleans.EventSourcing to have
Orleans.CQRS soon 