2008-10-13 6 views
9

Есть что-то, что я хочу настроить в System.Web.Script.Services.ScriptHandlerFactory и других .NET-материалах внутри внутреннего класса. К сожалению, это внутренний класс. Какие параметры у меня есть при попытке настроить метод в этом классе?Как вы «переопределяете» внутренний класс на C#?

+0

Вы действительно не должны, так как владелец класса пометил его как внутренний (читай .. не распространяются, так как я могу изменить это позже/Это незавершенная работа/еще не лучшая). Создайте свою собственную копию класса и используйте, если вам действительно нужно. – Gishu 2008-10-13 06:11:08

ответ

6

Возможно, вы найдете this recent article просветительский. В основном, он говорит, что вы не можете переопределить что-либо, помеченное internal, и источник примерно такой же авторитетный, как и он. Лучшее, на что вы можете надеяться, - это метод расширения.

+0

Блог Эрика Липперта - отличный ресурс, я следил за ним в течение многих лет. – Kev 2008-10-13 02:46:35

5

Внутреннее ключевое слово означает, что единица кода (класс, метод и т. Д.) Является «общедоступной» для сборки, в которой она находится, но является частной для любой другой сборки.

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

Одним словом, вы должны быть SOL.

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

using System; 
... 
using System.Web.Script.Services 

namespace MyGreatCompany.ScriptServices 
{ 
    public class MyScriptHandlerFactory /* implement all the interfaces */ 
    { 
     private ScriptHandlerFactory internalFactory; 
     public MyScriptHandlerFactory() 
     { 
      internalFactory = new ScriptHandlerFactory(); 
     } 
     ... 
    } 
} 

Это мог сделать то, что вы хотите достичь возможно, но это будет не очень.

1

Я считаю, что вы можете использовать Reflection, чтобы обойти модификаторы доступа на классе, так что, возможно, вы можете использовать Reflection.Emit для создания типа, который наследует от внутреннего типа (но НЕ запечатанного модификатор), хотя я не может найти пример этого онлайн.

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

+0

Он также, вероятно, работает только тогда, когда вы работаете под полным доверием. Любой контекст, требующий проверки, будет терпеть неудачу, если вы нарушите контроль доступа. – 2008-10-13 05:23:19

0

Это зависит от сборки. Это могло бы нарушить некоторые лицензирования (хотя его похожим на какое-то статическое связывание), и, возможно, даже сделать развертывание кошмар, но вы могли бы рассмотреть:

  • Decompile и скопировать код на ваш собственный проект; изменять по мере необходимости
  • Recompile/залатать сборку и добавить «InternalsVisibleToAttribute»