Переопределение методов в скомпилированной библиотеке без наследования в C #

У меня есть библиотека классов на C #, которая скомпилирована в dll. Можно ли что-то изменить в методе скомпилированного класса для конкретного проекта, не затрагивая исходный исходный код или не создавая новый класс по наследству?


person Mark Clancy    schedule 01.07.2010    source источник


Ответы (6)


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

person Dan Bryant    schedule 01.07.2010
comment
Спасибо, не могли бы вы дать мне пример класса-оболочки? Другая проблема, с которой я столкнулся, заключается в том, что скомпилированные классы должны вызывать другие методы в этих классах, поэтому, если я их переопределю, им нужно будет вызвать переопределенный метод. - person Mark Clancy; 01.07.2010
comment
Обертка будет работать только для вашего использования класса, так как вы можете создать и использовать оболочку при доступе к ней. Другие методы обернутого класса не будут знать об оболочке, поэтому это не будет работать так, как вы намереваетесь. Возможно, вы захотите пересмотреть свой дизайн, чтобы полностью обойти эту проблему, поскольку переписывание IL для введения обходных путей, вероятно, затруднит сопровождение вашего кода. - person Dan Bryant; 01.07.2010

Нет, по сути.

Как вы сказали, лучшим вариантом должно быть создание собственного класса и переопределение рассматриваемого метода (при условии, что он не запечатан).

Вы можете добавить в класс функциональные возможности, используя метод расширения.

person David Neale    schedule 01.07.2010

Я так не думаю. Вы можете создать метод расширения, но у него не будет доступа к частным / защищенным / внутренним членам.

person Matthew Dresser    schedule 01.07.2010

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

Если вас устраивает немного другая сигнатура метода, напишите метод расширения.

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

Если ты все еще недоволен, я не могу тебе помочь.

person Tomas Aschan    schedule 01.07.2010

Насколько мне известно, нет. Не могли бы вы подробнее рассказать о своем сценарии, почему вам нужно сделать что-то подобное?

person Jagmag    schedule 01.07.2010

С некоторым серьезным взломом, связанным с отражением и испусканием отражения в конечно, новый домен приложения. Но я сомневаюсь, что оно того стоит.

person Pontus Gagge    schedule 01.07.2010