2013-08-20 2 views
2

Я ищу способ вызова частного метода из базового класса в производных классах с помощью TypeBuilder. Я знаю, что это можно сделать, просто вызвав метод посредством отражения, но попытавшись вызвать метод passthrough, сгенерированный с результатами типаbuilder, в MethodAccessException. Кто-нибудь нашел способ обойти эту проблему?Вызов частного метода в BaseClass из производного класса с Reflection.Emit

ответ

4

Нет проблем. Вы не можете называть частные методы - вот почему они частные. Тот факт, что вы можете сделать это с отражением, когда у вас есть подходящее доверие, - это бэкдор, а не указание на то, что это то, что вы должны делать другими способами.

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

+1

Эта идея возникла из-за необходимости быстро получить устаревший код в модульном тесте без необходимости немедленной реорганизации. Я хорошо знаю, что эта функциональность нарушает инкапсуляцию и не означает, что она относится к ней как к проблеме, мне было просто интересно узнать, возможно ли это. – dSquared

+1

@dSquared: если это для тестирования (так что ваш устаревший код находится под вашим контролем), я бы подумал о том, чтобы сделать его «внутренним» методом (с некоторым указанием, что он обычно будет закрытым), а затем использовать «InternalsVisibleTo», чтобы получить доступ к это из тестовой сборки. –

+1

Это, наряду с защитой методов защиты (вывод и вызов в тестовом классе), - это два решения, которые я часто использую и, кажется, работают очень хорошо. Наверное, я просто искал способ изменения модификаторов доступа для тестирования. – dSquared

 Смежные вопросы

  • Нет связанных вопросов^_^