Как вы «переопределяете» внутренний класс в C #? - PullRequest
12 голосов
/ 13 октября 2008

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

Ответы [ 4 ]

9 голосов
/ 13 октября 2008

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

6 голосов
/ 13 октября 2008

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

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

Короче говоря: вы должны быть 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 голос
/ 13 октября 2008

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

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

0 голосов
/ 13 октября 2008

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

  • Декомпилируйте и скопируйте код в ваш собственный проект; изменить по необходимости
  • Перекомпилируйте / исправьте сборку и добавьте InternalsVisibleToAttribute
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...