Реальный мир использует Reflection.Emit - PullRequest
37 голосов
/ 22 февраля 2010

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

После просмотра Reflection.Emit как требования к работе в игровой компании мне стало интересно, где еще он используется.

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

Примечание Я думаю, PostSharp / AOP использует его.

Ответы [ 17 ]

1 голос
/ 03 июля 2018
  1. Создание декларативного кода, такого как использование интерфейса для объявления базовой службы HTTP REST. https://github.com/neurospeech/retro-core-fit

  2. Повышение производительности, большую часть времени я использую Expression.Compile для создания фрагмента кода для быстрого получения информации путем компиляции выражения выражения для скомпилированного делегата, который может быть выполнен в будущем. Если вы используете PropertyInfo.GetValue, это очень медленно, но если вы создаете выражение для доступа к свойству и компилируете его для делегата (который внутренне использует Reflection.Emit), это значительно экономит время ЦП.

1 голос
/ 22 февраля 2010
0 голосов
/ 28 апреля 2019

Я на самом деле разрабатываю свой собственный язык и создаю его компилятор, используя Reflection.Emit.
.NET Framework. Кто-то может подумать, что сборка компилятора с использованием C # нехороша, но на самом деле все работает хорошо, а производительность во время компиляции достаточно хороша. Кроме того, это, очевидно, никак не связано с производительностью среды выполнения, которая будет зависеть от CLR, а не от моего компилятора (за исключением минимальной оптимизации, такой как приоритет оператора). Я опубликую его на GitHub, как только закончу.

0 голосов
/ 03 июля 2018

Генерация перечислений из внешних данных:

Динамическое перечисление в C #

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

0 голосов
/ 25 декабря 2017

Например, Entity Framework использует Reflection.Emit для создания прокси-классов во время выполнения, которые наследуются от классов вашей модели для обеспечения отложенной загрузки и отслеживания изменений .

0 голосов
/ 24 ноября 2017

Мне нравится больше изучать AI-Inspired для самообучения. Это позволяет нам создавать класс или модуль во время выполнения

0 голосов
/ 05 ноября 2012

Reflection.Emit namespace используется для разработки LinqPad. Он помогает динамически создавать типизированные Datacontexts. Проверьте эту ссылку http://www.linqpad.net/HowLINQPadWorks.aspx.

...