Переопределение приватного метода с помощью Reflection - PullRequest
9 голосов
/ 20 сентября 2009

Можно ли переопределить закрытый метод с помощью Reflection в .NET 3.5?

Ответы [ 4 ]

7 голосов
/ 20 сентября 2009

Ну, это должно быть virtual, чтобы можно было его переопределить (записав динамический тип, который наследует от класса), и вы не можете иметь private virtual (это не имеет смысла). Возможно, вы могли бы переопределить internal virtual, но я подозреваю, что даже это может нанести ущерб безопасности. В конечном счете, я бы сказал, нет.

5 голосов
/ 20 сентября 2009

Не используя только Reflection. Возможно, лучшее, что вы могли бы сделать, это использовать Reflection в сочетании с Reflection.Emit или CodeDom для дублирования класса в новом пространстве имен. Когда вы сталкиваетесь с закрытым методом, который хотите заменить, вы не копируете его, вы отправляете замену.

Однако есть много методов, которые разработчик может использовать, которые делают эту технику намного, намного сложнее. Разбиение реализации класса на множество частных или внутренних классов является одним из таких примеров.

Примечание: используя CodeDom, вам нужно будет построить график в памяти, скомпилировать его, а затем загрузить получившуюся сборку.

Это, вероятно, намного больше проблем, чем оно того стоит.

Другой способ сделать это - использовать Reflector , чтобы разобрать класс, взять код и построить из него свой собственный класс с помощью метода replace. Опять же, существуют значительные технические и юридические препятствия, которые необходимо преодолеть. Вы можете многому научиться из дизассемблированного кода.

1 голос
/ 21 сентября 2009

Typemock Isolator должен быть в состоянии сделать это, но делает это через API профилировщика .NET (по словам Роя Ошерова в Искусство модульного тестирования ).

1 голос
/ 20 сентября 2009

Не с помощью отражения. Вам нужно использовать какой-то AOP.

...