Не используя только Reflection. Возможно, лучшее, что вы могли бы сделать, это использовать Reflection в сочетании с Reflection.Emit или CodeDom для дублирования класса в новом пространстве имен. Когда вы сталкиваетесь с закрытым методом, который хотите заменить, вы не копируете его, вы отправляете замену.
Однако есть много методов, которые разработчик может использовать, которые делают эту технику намного, намного сложнее. Разбиение реализации класса на множество частных или внутренних классов является одним из таких примеров.
Примечание: используя CodeDom, вам нужно будет построить график в памяти, скомпилировать его, а затем загрузить получившуюся сборку.
Это, вероятно, намного больше проблем, чем оно того стоит.
Другой способ сделать это - использовать Reflector , чтобы разобрать класс, взять код и построить из него свой собственный класс с помощью метода replace. Опять же, существуют значительные технические и юридические препятствия, которые необходимо преодолеть. Вы можете многому научиться из дизассемблированного кода.