Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
My_shpory_Ivan_Ivanich (2).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
149.35 Кб
Скачать

6. Тип Type и пространство System.Reflection

Пространства имен System.Reflection содержат типы, обеспечивающие управляемое представление загруженных типов, методов и полей и позволяющие динамически создавать и вызывать типы. Дочернее пространство имен содержит типы, позволяющие компилятору или другому средству создавать метаданные или код на языке MSIL.

Пространство имен System.Reflection содержит типы, предназначенные для извлечения сведений о сборках, модулях, членах, параметрах и других объектах в управляемом коде путем обработки их метаданных. Эти типы также можно использовать для работы с экземплярами загруженных типов, например для подключения событий или вызова методов.

Класс Type является корневым классом для функциональных возможностей пространства имен System.Reflection и основным способом доступа к метаданным. С помощью членов класса Type можно получить сведения об объявленных в типе элементах: конструкторах, методах, полях, свойствах и событиях класса, а также о модуле и сборке, в которых развернут данный класс.

Объект Type возвращает оператор языка C# typeof (оператор GetType в Visual Basic, оператор typeid в Visual C++).

Представляющий тип объект Type уникален; это означает, что две ссылки на объект Type указывают на один и тот же объект тогда и только тогда, когда они представляют один и тот же тип. Это позволяет сравнивать объекты Type по равенству ссылок.

Данный класс является потокобезопасным; несколько потоков могут одновременно считывать данные из экземпляра этого типа. Экземпляр класса Type может представлять типы для следующих объектов:

  • Классы

  • типы значений;

  • Массивы

  • Интерфейсы

  • Указатели

  • Перечисления

  • сконструированных универсальных типов и определений универсальных типов,

  • аргументов типов и параметров типов сконструированных универсальных методов, определений универсальных типов и определений универсальных методов.

Ссылку на объект Type, связанный с определенным типом, можно получить одним из следующих способов.

  • Метод Object.GetType возвращает объект Type, представляющий тип экземпляра.

  • и др.

Примеры

В следующем примере кода показано несколько типичных функций класса Type. Оператор языка C# typeof (оператор GetType в Visual Basic, оператор typeid в Visual C++) используется для извлечения объекта Type, представляющего тип String. В этом объекте Type метод GetMethod используется для получения объекта MethodInfo, представляющего перегрузку Substring, которая принимает значения, соответствующие начальному расположению и длине.

Type t = typeof(String);

MethodInfo substr = t.GetMethod("Substring", new Type[] { typeof(int), typeof(int) });

Object result = substr.Invoke("Hello, World!", new Object[] { 7, 5 });

Console.WriteLine("{0} returned: {1}.", substr, result);

7. Создание объектов с помощью рефлексии, вызов методов объектов средствами рефлексии

Создание объектов

Конструкторы конкретного типа получаются при вызове метода GetConstructors() для объекта класса Type. Ниже приведена одна из наиболее часто используемых форм этого метода:

ConstructorInfо[] GetConstructors()

ConstructorInfо[] GetConstructors(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | … )

Метод GetConstructors() возвращает массив объектов класса ConstructorInfо, описывающих конструкторы. Класс ConstructorInfo является производным от абстрактного класса MethodBase, который в свою очередь наследует от класса MemberInfo. В нем также определен ряд собственных методов. К их числу относится интересующий нас метод GetConstructors(), возвращающий список параметров, связанных с конструктором. Этот метод действует таким же образом, как и упоминавшийся ранее метод GetParameters(), определенный в классе MethodInfo.

Как только будет обнаружен подходящий конструктор, для создания объекта вызывается метод Invoke(), определенный в классе ConstructorInfo. Ниже приведена одна из форм этого метода:

object Invoke(object[] parameters)

Вызов методов

Type t = typeof(String);

MethodInfo substr = t.GetMethod("Substring", new Type[] { typeof(int), typeof(int) });

Object result = substr.Invoke("Hello!", new Object[] { 7, 5 });

Console.WriteLine("{0} returned: {1}.", substr, result);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]