Я ищу способ вызова частного метода из базового класса в производных классах с помощью TypeBuilder. Я знаю, что это можно сделать, просто вызвав метод посредством отражения, но попытавшись вызвать метод passthrough, сгенерированный с результатами типаbuilder, в MethodAccessException. Кто-нибудь нашел способ обойти эту проблему?Вызов частного метода в BaseClass из производного класса с Reflection.Emit
2
A
ответ
4
Нет проблем. Вы не можете называть частные методы - вот почему они частные. Тот факт, что вы можете сделать это с отражением, когда у вас есть подходящее доверие, - это бэкдор, а не указание на то, что это то, что вы должны делать другими способами.
Если у вас есть все Возможно, вы должны перепроектировать, чтобы избежать желания вызвать частный метод. Если у вас абсолютно есть, позвоните, используйте отражение - тот факт, что это уродливо, является признаком того, что вы находитесь в уродливой ситуации.
Эта идея возникла из-за необходимости быстро получить устаревший код в модульном тесте без необходимости немедленной реорганизации. Я хорошо знаю, что эта функциональность нарушает инкапсуляцию и не означает, что она относится к ней как к проблеме, мне было просто интересно узнать, возможно ли это. – dSquared
@dSquared: если это для тестирования (так что ваш устаревший код находится под вашим контролем), я бы подумал о том, чтобы сделать его «внутренним» методом (с некоторым указанием, что он обычно будет закрытым), а затем использовать «InternalsVisibleTo», чтобы получить доступ к это из тестовой сборки. –
Это, наряду с защитой методов защиты (вывод и вызов в тестовом классе), - это два решения, которые я часто использую и, кажется, работают очень хорошо. Наверное, я просто искал способ изменения модификаторов доступа для тестирования. – dSquared