.NET: расширять классы при загрузке или есть концепция загрузчиков классов?

Этот вопрос, вероятно, задавали сотни раз, но опять же: есть ли в .NET концепция загрузчиков классов. И позвольте мне пояснить проблему: я не хочу вводить класс с несколькими дополнительными элементами кода, необходимыми для того, чтобы иметь возможность подключать объекты этого класса к разрабатываемой структуре.

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

Это наверняка возможно и в .NET путем размышления. Итак, использование Type :: GetType () вызывает TypeResolver текущего экземпляра AppDomain. В преобразователе загружается исходный тип, который затем используется в качестве базового класса производного типа, созданного в динамической сборке. Это немного сложно, потому что производные типы не находятся в одной сборке, поэтому внутренние классы непросто обрабатывать. Но это выполнимо и стабильно.

А теперь называйте меня педантичным немцем, у меня загружены исходный тип и производный тип, тогда как в Java у меня есть только модифицированный тип. Смогу ли я сделать это и в .NET?


person jasnevo    schedule 21.11.2012    source источник
comment
Вы смотрели на Reflection Emit? Так вы расширяете классы в .NET. Конечно, вы должны убедиться, что ваши базовые классы не sealed и что любые методы, которые вы хотите переопределить, virtual.   -  person casperOne    schedule 21.11.2012
comment
Похоже, вам нужен какой-то АОП? Один из простых способов - использовать библиотеку. Замок Виндзор всегда делал АОП довольно простым. docs.castleproject.org/%28S%28f4rlcg45v1q3epnx3mwwzl45%29%29/   -  person jrwren    schedule 21.11.2012
comment
Как я уже сказал, у меня есть решение с Reflection.Emit путем получения типов. Однако мне нравится подход Java, в котором исходный класс расширяется, а приложению доступен только расширенный класс.   -  person jasnevo    schedule 21.11.2012
comment
Aes, вы можете назвать это аспектами, которые должны быть добавлены к определенным классам. Однако эти аспекты должны быть предоставлены во время выполнения произвольным классам в основном от третьих лиц. Таким образом, эти классы не могут быть помечены атрибутами и т.п.   -  person jasnevo    schedule 21.11.2012
comment
Вы изучали некоторые классы Microsoft Extensibility Framework (MEF)? Они разработаны, чтобы разрешить конфигурацию внедрения зависимостей AOP или времени выполнения. stackoverflow.com/q/293051/941243   -  person Chris    schedule 21.11.2012


Ответы (1)


Вот что произошло с этой проблемой, чтобы кое-что поработать.

На самом деле я презирал подход к изменению существующих классов при загрузке. С точки зрения .NET, DynamicMethod с владельцем, установленным на расширяемый тип, сделает свое дело. Однако вы не можете добавить объект данных таким образом - если это необходимо, вам нужно создать свой собственный класс с помощью Reflection.TypeBuilder. Обе концепции недоступны в .Net Standard (бывший PCL).

Я настоятельно рекомендую вам связаться с DLR (динамическими метаобъектами) в случае, если у вас есть аналогичные требования - это концепция, которую я наконец начал использовать.

person jasnevo    schedule 24.06.2018