Атрибуты, сборки, рефлексия
Рефлексия (Reflection) – предоставление выполняемому коду информации о нем самом.
Рефлексия представляет собой процесс анализа типов (структуры типов) в ходе выполнения приложения (сборки). В .NET рефлексия реализуется свойствами и методами класса System.Type и классов пространства имен System.Reflection.
Пространство имен System.Reflection
Пространство имен System.Reflection содержит классы и интерфейсы, которые позволяют организовать просмотр загруженных в сборку типов, методов, полей (данных-членов) и обеспечивают динамические механизмы реализации типов и вызова методов.
Включает множество взаимосвязанных классов, интерфейсов, структур и делегатов, предназначенных для реализации процесса отражения.
System.Reflection определяет типы для организации позднего связывания и динамической загрузки типов.
Неполный перечень классов представлен ниже:
Тип | Назначение |
---|---|
Assembly | Методы для загрузки, описания и выполнения разнообразных операций над сборкой |
AssemblyName | Информация о сборке (идентификатор, версия, язык реализации) |
EventInfo | Информация о событиях |
FieldInfo | Информация о полях |
MemberInfo | Абстрактный базовый класс, определяющий общие члены для EventInfo, FieldInfo, MethodInfo, PropertyInfo |
MethodInfo | Информация о методе |
Module | Позволяет обратиться к модулю в многофайловой сборке |
ParameterInfo | Информация о параметре |
PropertyInfo | Информация о свойстве |
Класс System.Type
Класс System.Type содержит методы, позволяющие получать информацию о типах приложения. Является основой для реализации функциональности пространства имен System.Reflection и средством для получения доступа к метаданным.
Использование членов класса Type позволяет получить информацию о:
- типе ( GetType(string) );
- конструкторах ( GetConstructors() );
- методах ( GetMethods() );
- данных-членах ( GetFields() );
- свойствах ( GetProperties() );
- событиях, объявленных в классе ( GetEvents() );
- модуле;
- сборке, в которой реализуется данный класс.
Объект — представитель класса Type уникален. Две ссылки на объекты — представители класса Type оказываются эквивалентными, если только объекты были созданы в результате обращения к одному и тому же типу.
Объект — представитель класса Type может представить любой из следующих типов:
- классы;
- типы-значения;
- массивы;
- интерфейсы;
- указатели;
- перечисления.
Ссылка на объект — представитель класса Type, ассоциированная с некоторым типом, может быть получена одним из следующих способов.
- В результате вызова метода
Type Object.GetType()
(метода — члена класса Object ), который возвращает ссылку на объект — представитель типа Type, представляющий информацию о типе. Вызов производится от имени объекта — представителя данного типа. Вызов становится возможен в связи с тем, что любой класс наследует тип Object.
- В результате вызова статического метода — члена класса Type
public static Type Type.GetType(string)
параметром является строка со значением имени типа. Возвращает объект — представитель класса Type, с информацией о типе, специфицированном параметром метода.
- От имени объекта — представителя класса Assembly — от имени объекта-сборки (самоописываемого, многократно используемого, версифицируемого БЛОКА (фрагмента) CLR-приложения) вызываются методы
Type[] Assembly.GetTypes() Type Assembly.GetType(string) // Получаем ссылку на сборку, содержащую объявление типа MyType, // затем – массив объектов - представителей класса Type. Type[] types = (Assembly.GetAssembly(typeof(MyType))).GetTypes(); // Без комментариев. Type tt = (Assembly.GetAssembly(typeof(MyType))).GetType("MyType");
Здесь используется операция typeof. Операндом этой унарной операции является обозначение класса (в буквальном смысле – имя класса).
class MyType { ::::: } ::::: Type t = typeof(MyType);
- От имени объекта – представителя класса Module (модуль – portable executable файл с расширением .dll или .exe, состоящий из одного и более классов и интерфейсов):
Type[] Module.GetTypes() Type Module.GetType(string) Type[] Module.FindTypes(TypeFilter filter, object filterCriteria)
где TypeFilter – класс-делегат.
- В результате выполнения операции typeof(), которая применяется для построения объекта-представителя класса System.Type. Выражение, построенное на основе операции typeof, имеет следующий вид:
typeof(type)
Операнд выражения – тип, для которого может быть построен объект – представитель класса System.Type.
Пример применения операции:
using System; using System.Reflection; public class MyClass { public int intI; public void MyMeth() { } public static void Main() { Type t = typeof(MyClass); // Альтернативная эквивалентная конструкция // MyClass t1 = new MyClass(); // Type t = t1.GetType(); MethodInfo[] x = t.GetMethods(); foreach (MethodInfo m in x) { Console.WriteLine(m.ToString()); } Console.WriteLine(); MemberInfo[] x2 = t.GetMembers(); foreach (MemberInfo m in x2) { Console.WriteLine(m.ToString()); } } }