Создание классов С# во время выполнения

Мне было интересно узнать о динамическом создании класса во время выполнения на С# и наткнулся на эту статью. http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html Мне любопытно услышать некоторые плюсы и минусы относительно создания класса во время выполнения.

Любые мнения?

Ответы

Ответ 1

Мета-программирование имеет все преимущества генерации кода времени сборки, но без дополнительного кода. Это очень часто встречается в библиотечном коде, таком как ORM, сериализаторы, некоторые типы AOP, контейнеры DI/IoC и т.д.

  • + избегает необходимости дополнительных шагов сборки или написания мирского кода.
  • + такой код может обрабатывать то, что на самом деле имеет место во время выполнения, вместо того, чтобы обрабатывать какие-либо необычные края или множество оберток вокруг оберток (шаблон декоратора)
  • + позволяет codegen в сценариях, где метаданные известны только во время выполнения
  • + runtime IL может иметь больше доступа к закрытым полям и т.д., благодаря тому, что DynamicMethod может быть связан с типом; полностью сгенерированный (dll) код потребует [InternalsVisibleTo] или аналогичного, что может быть невозможно
  • - не все системы поддерживают runtime code-gen; он отключен на некоторых настройках сервера, компактной каркасе, iPhone и т.д.
  • - это ошибка уродливая. Независимо от того, как вы это делаете, это не нормальный код.
  • - ему нужно действительно хорошее понимание того, как вещи действительно работают под обложками.
  • +, если вы получите действительно хорошее представление о том, как вещи действительно работают под обложками

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

Ответ 2

Это не вопрос плюсов и минусов.

Иногда удобно создавать класс на основе информации, которая утомительна для преобразования в код по-другому или информации, недоступной до выполнения.

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

Ответ 3

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

Ответ 4

У вас, вероятно, уже есть опыт работы с уже созданными во время выполнения классами. Генерики создаются во время выполнения в среде CLR, когда они в первую очередь необходимы. Итак, это реализация XmlSerializer.

Построение классов с нуля во время выполнения, скорее всего, будет довольно уродливым (если вам не нравится много размышлений и код Code Dom). Это была бы редкая ситуация, когда это было самым ясным и простым решением.

Ответ 5

Преимущество: вы можете создавать во время выполнения все необходимое.

Недостаток: у вас нет проверки времени компиляции, поэтому, если что-то пойдет не так, все взорвется.

В основном то же самое, что и преимущества/недостатки использования Reflection.

Ответ 6

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