Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие NET.doc
Скачиваний:
26
Добавлен:
07.03.2016
Размер:
4.63 Mб
Скачать

12.3. Рефлексія

Рефлексія - це отримання інформації про типи під час виконання програми. Наприклад, можна отримати список всіх класів і інтерфейсів збірки, список елементів кожного з класів, список параметрів кожного методу і так далі. Вся інформація береться з метаданих збірки. Для використання рефлексії необхідні клас System.Туре і типи простору імен System.Reflection.

У класі Турe описані методи, які дозволяють отримати інформацію про типи. У просторі імен System.Reflecion описані типи, що підтримують Турe, а також класи, які служать для організації пізнього зв’язування і динамічного завантаження збірок.

Властивості і методи класу Турe приведені в таблиці 12.1

Таблиця 12.1

Елементи класу Турe

Елемент

Опис

IsAbstract, IsArray, IsNestedPublic,

IsClass, IsNestedPrivate,

IsCOMObject, IsEnum,

Islnterface, IsPrimitive,

IsSealed, IsValueType

Властивості, що дозволяють отримати відповідні характеристики конкретного типу в програмі (наприклад, чи є він абстрактним, чи є він масивом, класом і т. п.). Приведені не всі властивості

GetConstructors, GetEvents,

GetFields, GetInterfaces,

GetMethods, GetMembers,

GetNestedTypes, GetProperties

Методи, що повертають масив з набором відповідних елементів (конструкторів, подій, полів і т. п.). Повертаєме значення відповідає імені методу, наприклад, GetFields повертає масив типу FieldInfo, GetMethods - масив типу MethodInfo. Для кожного з методів є парний йому (без символу S в кінці імені), який призначений для роботи з одним заданим в параметрі елементом (наприклад, GetMethod і GetMethods)

FindMembers

Метод повертає масив типу MemberInfo на основі заданих критеріїв пошуку

GetType

Метод повертає об'єкт типу Турe за іменем, заданому у вигляді рядка

InvokeMember

Метод використовується для пізнього зв’язування заданого елементу

Скористатися цими методами можна після створення екземпляра класу Турe. Оскільки це абстрактний клас, звичайний спосіб створення об'єктів за допомогою операції new непридатний, зате існують три інших способи:

1. У базовому класі object описаний метод GetType, яким можна скористатися для будь-якого об'єкту, оскільки він успадковується. Метод повертає об'єкт типу Турe, наприклад:

Monster X = new Monster();

Type t = X.GetType();

2. У класі Type описаний статичний метод GetType з одним параметром рядкового типу, на місце якого потрібно передати ім'я класу (типу), наприклад:

Type t = Type.GetType("Monster");

3. Операція typeof повертає об'єкт класу Туpe для типу, заданого як параметр, наприклад:

Type t = typeof (Monster);

При використанні другого і третього способів створювати екземпляр досліджуваного класу немає необхідності.

Як видно з таблиці 12.1, багато методів класу Турe повертають екземпляри стандартних класів (наприклад, MemberInfo). Ці класи описані в просторі імен System.Reflection. Найбільш важливі з цих класів перераховані в таблиці 12.2.

Таблиця 12.2

Деякі класи простору імен System.Reflection

Тип

Опис

Assembly

Містить методи для отримання інформації про збірку, а також для завантаження збірки і виконання з нею різних операцій

AssemblyName

Дозволяє отримувати інформацію про збірку (ім'я, версія, сумісність, природна мова і т. п.)

EventInfo

Зберігає інформацію про подію

FieldInfo

Зберігає інформацію про поле

MemberInfo

Абстрактний базовий клас, що визначає загальні елементи для класів EventInfo, FieldInfo, MethodInfo і PropertyInfo

MethodInfo

Зберігає інформацію про метод

Module

Дозволяє звернутися до модуля в багатофайловій збірці

ParameterInfo

Зберігає інформацію про параметр

PropertyInfo

Зберігає інформацію про властивість

У лістингу 12.3 приведені приклади використання методів і класів.

Лістинг 12.3. Отримання інформації про класи

using System;

using System.Reflection;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace exam100

{

using MonsterLib;

class Program

{

static void Info(Type t)

{

Console.WriteLine("======= Класс " + t.FullName);

if (t.IsAbstract) Console.WriteLine("абстрактний ");

if (t.IsClass) Console.WriteLine("звичайний ");

if (t.IsEnum) Console.WriteLine("перечислений");

Console.WriteLine();

MethodInfo[] met = t.GetMethods();

foreach (MethodInfo m in met) Console.WriteLine(m);

Console.WriteLine();

PropertyInfo[] prs = t.GetProperties();

Console.WriteLine();

}

static void Main(string[] args)

{

Type t = typeof(Spirit);

Info(t);

t = typeof(Monster);

Info(t);

t = typeof(Daemon);

Info(t);

}

}

}

Результат роботи програми приведений на рис. 12.4.

Рис. 12.4. Результат роботи програми