Самый простой способ - делается class template, который наследуется от расширяемого типа. В него добавить нужный метод. Останется только решить каким из способов в коде получить нужный "шаблонный" тип. Скорее всего тут помогут конструкторы копирования и перегрузка операторов приведения типа. Вобщем мнооого стремного кода.
Ну в итоге жесть получается, надо для каждого типа писать такую обертку, к тому же универсального типа типа object нету поэтому если какую-то мелкую утилиту типо котлиновских apply let run и прочего хочешь сделать надо будет для каждого фигачить, ладно придется мучаться