I am trying to get a dynamically dispatchable borrow to an instance of an object implementing both Reader and Seek.
I understand that Rust
You can create an empty trait that merges those two traits:
use std::io::{Read, Seek};
trait SeekRead: Seek + Read {}
impl<T: Seek + Read> SeekRead for T {}
fn user_dynamic(stream: &mut SeekRead) {}
This will create a new vtable for SeekRead that contains all the function pointers of both Seek and Read.
You will not be able to cast your &mut SeekRead to either &mut Seek or &mut Read without some trickery (see Why doesn't Rust support trait object upcasting?)