Описание Reflection (Отражение)
Механизм отражения позволяет получать объекты (типа
Type), которые описывают сборки, модули и типы. Из внешнего программного кода (.dll). Отражение можно использовать для динамического создания экземпляра типа, привязки типа к существующему объекту, а также получения типа из существующего объекта и вызова его методов или доступа к его полям и свойствам.
Reflection. Emit — пространство имён, классы и методы которого позволяют компилятору выдавать метаданные и MSIL.
-Метаданные: данные, содержащие информацию об объекте
-MSIL/CIL/IL (Microsoft intermediate language): Специальная бинарная форма.
Затем уже при выполнении сборки JIT компилирует методы, закодированные в MSIL, в бинарный/машинный код текущей платформы, который затем собственно и выполняется.
Особенности
- Компилирования кода во время его выполнения. (Т.е создание методов/классов/параметров и т. д. непосредственно во время работы приложения, а не при компиляции исходного кода).
- В отличии от Reflection который использует код общего назначения и метаданные Reflection. Emit генерирует код специально для конкретной задачи избегая многократной проверки типов, совместимость сигнатур и параметров и т. д. Reflection. Emit создаёт инструкцию один раз, которую впоследствии можно многократно вызывать. За счёт чего увеличивается быстродействие.
- Создание динамических сборок.
- Обход ограничений языка.
Применение в популярных пакетах:
Regex: (регулярные выражения) используют Reflection.Emit. Он должен разобрать выражение, чтобы перевести его в исполняемый код. Вот где в игру вступают классы Reflection.Emit. Regex использует Reflection. Emit для создания быстрой реализации заданного регулярного выражения.
XmlSerializer: использует изрядное количество рефлексии (что является довольно медленным вариантом), чтобы выяснить, какие данные находятся в заданном объекте, чтобы выполнить над ним необходимые операции по сериализации. Поэтому тот же XmlSerializer сгенерирует специальный класс сериализатора во время исполнения и сохранит его в специальной папке для последующего использования.
Automapper: используют Reflection. Emit для генерации соответствия между отображением экземпляров одного типа в другой.
Сравнение производительности