Рефлексія - це отримання інформації про типи під час виконання програми. Наприклад, можна отримати список всіх класів і інтерфейсів збірки, список елементів кожного з класів, список параметрів кожного методу і так далі. Вся інформація береться з метаданих збірки. Для використання рефлексії необхідні клас 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. Результат роботи програми