2010-04-17 3 views
14

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

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

+0

дополнение к этому вопросу? Можете ли вы сохранить код, который был создан во время выполнения, используя Reflection для сборки. Таким образом, вам не нужно создавать его снова? –

+0

Да, на самом деле ссылка, которую вы указали, уже сохраняет сгенерированный код. –

+0

lol. Смешно его самая последняя часть этого кода. Показывает, сколько я обращал внимание. Извини за это. –

ответ

19

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

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

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

+0

Спасибо всем за ваше мнение. –

0

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

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

0

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

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

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

5

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

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

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

2

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

0

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

Смежные вопросы