русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Рефлексія


Дата додавання: 2015-01-08; переглядів: 935.


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

 


<== попередня лекція | наступна лекція ==>
Створення бібліотеки | Атрибути


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн