Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
гавно для печати.docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
171.17 Кб
Скачать

41. Отражение и атрибуты. Понятие отражения. Класс System.Type. Получение информации о методах и типах. Атрибуты. Основы применения атрибутов.

Программный код в среде CLR упаковывается в сборки. Компоновочный файл (assembly) содержит информацию о развертывании приложения, ее версии. Он нужен для поддержки механизма безопасного взаимодействия компонентов, межъязыковой работоспособности. Обычно сборку отождествляют с компоновочным файлом, но фактически это логический контейнер, который содержит следующие данные: 1) метаданные сборки (манифест) – состоят из описания сборки (имя, версия, поддерживаемые языки). 2) метаданные типов – это информация описывает тип, включая пространство имен, имена классов, входящих в сборку, члены классов (конструкторы, методы, свойства) и их параметры; 3) код на промежуточном языке MSIL – он затем компилируется в двоичные машинные коды при запуске сборки; 4) ресурсы – это объекты (строки, изображения, подключаемые файлы), которые используются приложением.

Просмотреть манифест сборки можно с помощью Object Browser, а также с помощью утилиты дизассемблирования ILDasm.exe. Она позволяет просмотреть не только манифест, но и метаданные типов, инструкции IL, ресурсы.

ПУСК -> VsTools -> Promt -> ILDasm -> папка с проектом -> папка Debug -> *.exe.

Если дважды щелкнуть по нему, то попадаем в метаданные в блокноте. Обычно все компоненты находятся в одном файле. Говорят: однофайловая сборка. Этот файл имеет расширение *.dll или *.exe. Для создания многофайловых сборок, компоновочный файл связывают с другим файлом с помощью модификатора internal. Модификатор internal используется также для создания программных компонентов. Его назначение – заявить о том, что некоторый элемент известен во всех файлах, входящих в состав компоновочного файла, но не известен вне его.

Отражение (reflection) – это средство, которое позволяет получить информацию о типах (объектах) и управлять ими. Его называют также отображением типов. Используются для создания динамичных структур данных и упрощает подключение готовых модулей.

По существу, отражение служит для представления программного кода в виде объекта. Оно позволяет запрашивать и генерировать код от целых сборок, от его модулей или от отдельных выражений. Ядром отражения является класс System.Type. Объект этого класса воспроизводит или отражает базовый тип, который он представляет. Для использования отражения и класса Type нужно включить инструкцию: using System.Reflection;. Класс Type является производным от класса System.Reflection.MemberInfo. В этом классе имеются абстрактные свойства такие, как тип класса, тип интерфейса, имя типа и др. Используя методы и свойства класса Type, можно подробно включить информацию о типе, ведь во время компиляции подключенные программные коды становятся недоступными, а отражение (класс Type) позволяет получить информацию о программных кодах.

Атрибуты. С помощью атрибутов можно вносить в программу информацию описательного характера о классе, методе и т.д. Атрибут не является членом класса. Он записывается в квадратных скобках перед каким-то элементом сборки или класса. Например, в Windows приложениях в файле Program записан атрибут [STAThread] (Single Threaded Apartament) – модель организации однопоточной обработки. Атрибуты поддерживаются классом System.Attribute. Чтобы распознать что это атрибут, их называют составным именем. Например, ErrorAttribute, AttributeUsage. Хотя атрибуты – классы, но они очень просты. Обычно содержат лишь поля и свойства.

Встроенные атрибуты. В С# имеется 3 встроенных атрибута: 1) AttributeUsage – определяет перечисление типов данных, к которым можно применить атрибут. Его можно просмотреть в Object Browser. Это такие типы как интерфейсы, свойства, методы, классы, события и т.д. 2) Conditional – позволяет создавать условные методы. Условный метод – это метод, который вызывается только в том случае, если его идентификатор определен в директиве компилятора. Обычно его применяют при распространении пробных версий приложений. 3) Obsolete[“message”] – позволяет отмечать какой-либо элемент приложения как устаревший.