Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Консольне уведення-виведення




 

Консольні застосування мають обмежену область застосування, найпоширенішим з яких є навчання мові програмування. Для організації уведення і виведення використовується відомий вам клас Console, визначений в просторі імен System. У цьому класі визначено три стандартні потоки: вхідний потік Console.In класу TextReader і вихідні потоки Consolе.Out і Console.Error класу TextWriter.

За умовчанням вхідний потік пов'язаний з клавіатурою, а вихідні - з екраном. Проте можна перенаправити ці потоки на інші пристрої за допомогою методів SetIn і SetOut або засобами операційної системи (перенаправлення за допомогою операцій <, > і >>.

При обміні з консоллю можна застосовувати методи вказаних потоків, але частіше використовуються методи класу Console: Read, ReadLine, Write і WriteLine. Ці методи просто передають управління методам, що розташовуються нижче: In, Out і Error.

Використання двох вихідних потоків корисно, якщо треба розділити на нормальне виведення програми і її повідомлення про помилки. Наприклад, нормальне виведення програми можна направити у файл, а повідомлення про помилки - на консоль або у файл журналу.

 

11.6. Робота з каталогами і файлами

 

У просторі імен System.IO є чотири класи, призначені для роботи з фізичними файлами і структурою каталогів на диску: Directory, File, DirectoryInfo і FileInfo. З їх допомогою можна виконувати створення, видалення, переміщення файлів і каталогів, а також набуття їх властивостей.

Класи Directory і File реалізують свої функції через статичні методи. DirectoryInf o і FileInfo володіють схожими можливостями, але вони реалізуються шляхом створення об'єктів відповідних класів. Класи DirectoryInfo і FileInfo походять від абстрактного класу FilesystemInfo, який забезпечує їх базовими властивостями, описаними в таблиці 11.10.

 

Таблиця 11.10

Властивості класу FileSystemInfo

 

Властивість Опис
Attributes Отримати або встановити атрибути для даного об'єкту файлової системи. Для цієї властивості використовуються значення перелічення FileAttributes
CreationTime Отримати або встановити час створення об’єкту файлової системи
Exists Визначити, чи існує даний об'єкт файлової системи
Extension Отримати розширення файлу
FullName Повернути ім'я файлу або каталога з вказівкою повного шляху
LastAccessTime Отримати або встановити час останнього звернення до об'єкту файлової системи
LastWriteTime Отримати або встановити час останнього внесення змін в об'єкт файлової системи
Name Повернути ім'я файлу. Ця властивість доступна тільки для читання. Для каталогів повертає ім'я останнього каталога в ієрархії.

 

Клас DirectoryInfo містить елементи, що дозволяють виконувати необхідні дії з каталогами файлової системи. Ці елементи перераховані в таблиці 11.11

 

Таблиця 11.11

Елементи класу DirectoryInfo

 

Елемент Опис
Create, CreateSubDirectory Створити каталог або підкаталог по вказаному шляху у файловій системі
Delete Видалити каталог зі всім його вмістом
GetDirectories Повернути масив рядків, що представляють всі підкаталоги
GetFiles Отримати файли в поточному каталозі у вигляді масиву об'єктів класу FileInfo
MoveTo Перемістити каталог і весь його вміст на нову адресу у файловій системі
Parent Повернути батьківський каталог

 

У лістингу 11.9 приведений приклад, в якому створюються два каталоги, виводиться інформація про них і робиться спроба видалення каталога.

 

Лістинг 11.9. Використання класу DirectorInfo

using System;

using System.IO;

namespace examp83

{ class Class1

{ static void DirInfo(DirectoryInfo di)

{

// Виведення інформації про каталог

Console.WriteLine("===== Directory Info =====");

Console.WriteLine("Full Name: " + di.FullName);

Console.WriteLine("Name: " + di.Name);

Console.WriteLine("Parent: " + di.Parent);

Console.WriteLine("Creation: " + di.CreationTime);

Console.WriteLine("Attributes: "+ di.Attributes);

Console.WriteLine("Root: " + di.Root);

Console.WriteLine("===========================");

}

 

static void Main()

{

DirectoryInfo di1 = new DirectoryInfo(@"c:\MyDir");

DirectoryInfo di2 = new DirectoryInfo(@"c:\MyDir\temp");

 

try

{

// Створити каталоги

di1.Create();

di2.Create();

// Вивести інформацію про каталоги

DirInfo(di1);

DirInfo(di2);

// Спробувати видалити каталог

Console.WriteLine(" Спроба видалити {0}.", di1.Name);

di1.Delete(true);

}

catch (Exception)

{

Console.WriteLine(" Спроба не вдалася ");

}

}

}

}

 

Результат роботи програми:

===== Directory Info =====

Full Name: c:\MyDir

Name: MyDir Parent:

Creation: 30.04.2006 17:14:44

Attributes: Directory

Root: c:\

=====================

===== Directory Info =====

Full Name: c:\MyDir\temp

Name: temp Parent: MyDir

Creation: 30.04.2006 17:14:44

Attributes: Directory

Root: c:\

=====================

Спроба видалити MyDir.

Спроба не вдалася

 

Каталог не порожній, тому спроба його видалення не вдалася. Втім, якщо використовувати перевантажений варіант методу Delete з одним параметром, задаючим режим видалення, можна видалити і непорожній каталог:

 

dil.Delete(true); // видаляє непорожній каталог

 

Зверніть увагу на властивість Attributes. Деякі її можливі значення, задані в переліченні FileAttributes, приведені в таблиці 11.12.

 

Таблиця 11.12

Деякі значення перелічення FileAttributes

 

Значення Опис
Archive Використовується додатками при виконанні резервного копіювання, а в деяких випадках - при видаленні старих файлів
Compressed Файл є стислим
Directory Об'єкт файлової системи є каталогом
Encrypted Файл є зашифрованим
Hidden Файл є прихованим
Normal Файл знаходиться в звичайному стані, і для нього встановлені будь-які інші атрибути. Цей атрибут не може використовуватися з іншими атрибутами
Offline Файл, розташований на сервері, кеширований в сховищі на клієнтському комп'ютері. Можливо, що дані цього файлу вже застаріли
Readonly Файл доступний тільки для читання
System Файл є системним

 

Лістинг 11.10 демонструє використання класу FileInfo для копіювання всіх файлів з розширенням jpg з каталога d:\foto в каталог d:\temp. Метод Exists дозволяє перевірити, чи існує початковий каталог.

using System;

using System.IO;

namespace examp84

{

class Class1

{

static void Main()

{

try

{

string DestName = @"d:\fot";

DirectoryInfo dest = new DirectoryInfo(DestName);

dest.Create(); // створення цільового каталога

DirectoryInfo dir = new DirectoryInfo(@"d:\temp");

if (!dir.Exists) // перевірка існування каталога

{

Console.WriteLine("Каталог " +

dir.Name + " не існує");

return;

}

FileInfo[] files = dir.GetFiles("*.jpg"); // список файлів

foreach (FileInfo f in files)

f.CopyTo(dest + "1.txt"); // копіювання файлів

Console.WriteLine("Скопійовано " +

files.Length + " jpg-файлов");

Console.ReadLine();

}

catch (Exception e)

{

Console.WriteLine("Error: " + e.Message);

Console.ReadLine();

}

}

}

}

Використання класів Fi1e і Directory аналогічно, за винятком того, що їх методи є статичними і, отже, не вимагають створення об'єктів.

 

11.7. Збереження об'єктів (серіалізація)

 

У С# є можливість зберігати на зовнішніх носіях не тільки дані примітивних типів, але і об'єкти. Збереження об'єктів називається серіалізацією, а відновлення збережених об'єктів - десеріалізацією. При серіалізації об'єкт перетвориться в лінійну послідовність байтів. Це складний процес, оскільки об'єкт може включати множину успадкованих полів і посилання на вкладені об'єкти, які, у свою чергу, теж можуть складатися з об'єктів складної структури.

На щастя, серіалізація виконується автоматично, досить просто помітити клас, який сериалізується за допомогою атрибуту [ Serializable ]. Атрибути розглядаються в розділі 12, поки ж достатньо знати, що атрибути - це додаткові відомості про клас, які зберігаються в його метаданих. Ті поля, які зберігати не потрібно, позначаються атрибутом [ NonSerialized ], наприклад:

[Serializable]

class Demo

{

public int a = 1;

[NonSerialized]

public double y;

public Monster X. Y;

}

 

Об'єкти можна зберігати в одному з двох форматів: двійковому або SOAP (у вигляді XML-файла). У першому випадку слід підключити до програми простір імен System.Runtime.Serialization.Formatters.Binary, у другому - простір System.Runtime.Serialization.Formatters.Soap.

Розглянемо збереження об'єктів у двійковому форматі. Для цього використовується клас BinaryFormatter, в якому визначено два методи:

Serialize(потік, об'єкт);

Deserialize(потік);

Метод Serialize зберігає заданий об'єкт в заданому потоці, метод Deserialize відновлює об'єкт із заданого потоку.

У лістингу 11.11 об'єкт, приведеного раніше класу Demo зберігається у файлі на диску з ім'ям Demo.bin. Цей файл можна проглянути, відкривши його, наприклад, в Visual Studio.NET.

 

Лістинг 11.11. Сериалізація об'єкту

using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Binary;

namespace Examp85

{

[Serializable]

abstract class Spirit

{

public abstract void Passport();

}

[Serializable]

class Monster: Spirit

{

string name;

int health, ammo;

public Monster(int health, int ammo, string name)

{

this.health = health;

this.ammo = ammo;

this.name = name;

}

override public void Passport()

{

Console.WriteLine("Monster {0} \t health = {1} ammo = {2} ",

name, health, ammo);

}}

[Serializable]

class Demo

{

public int a = 1;

 

[NonSerialized]

public double b;

public Monster X, Y;

}

 

class Class1

{

static void Main()

{

// Запис об'єкту на диск

Demo d = new Demo();

d.X = new Monster(100, 80, "Вася");

d.Y = new Monster(120, 50, "Петя");

d.a = 2;

d.b = 5;

d.X.Passport();

d.Y.Passport();

Console.WriteLine(d.a);

Console.WriteLine(d.b);

FileStream f = new FileStream("c:\\Demo.bin",

FileMode.Create);

BinaryFormatter bf = new BinaryFormatter();

bf.Serialize(f, d); // збереження об'єкту d в потоці f

f.Close();

 

// Зчитування з диска

 

f = new FileStream("c:\\Demo.bin",

FileMode.Open);

bf = new BinaryFormatter();

d = (Demo)bf.Deserialize(f); // відновлення об'єкту

d.X.Passport();

d.Y.Passport();

Console.WriteLine(d.a);

Console.WriteLine(d.b);

f.Close();

}

}

}

 

Результат роботи програми:

Monster Вася health = 100 ammo = 80

Monster Петя health = 120 ammo = 50

Monster Вася health = 100 ammo = 80

Monster Петя health = 120 ammo = 50

Отже, для збереження об'єкту в двійковому форматі необхідно:

1. Підключити простір імен System.Runtime.Serialization. Formatters.Binary.

2. Помітити клас, що зберігається, і пов'язані з ним класи атрибутом [ Serializable ].

3. Створити потік і пов'язати його з файлом на диску або з областю оперативної пам'яті.

4. Створити об'єкт класу BinaryFormatter.

5. Зберегти об'єкти в потоці.

6. Закрити файл.

Як видно з лістингу 11.11 після збереження об'єкту на диску він зчитується з файлу.

При серіалізації зберігається все дерево об'єктів. При цьому значення поля у не було збережено, оскільки воно було помічене як таке, що не треба зберігати.

 

11.8. Рекомендації по програмуванню

Більшість програм тим або іншим чином працюють із зовнішніми пристроями, наприклад, як консоль, файл на диску або мережене з'єднання. Взаємодія із зовнішніми пристроями організовується за допомогою потоків, які підтримуються множиною класів бібліотеки.NET.

Потік визначається як послідовність байтів і не залежить від конкретного пристрою, з яким проводиться обмін. Класи бібліотеки дозволяють працювати з потоками в різних режимах і на різних рівнях: на рівні двійкового представлення даних, байтів і тексту. Двійкові і байтові потоки зберігають дані у внутрішньому представленні, текстові - в кодуванні Unicode.

Потік можна відкрити в синхронному або асинхронному режимі для читання, запису або додавання. Доступ до файлів може бути послідовним і довільним. Текстові файли дозволяють виконувати тільки послідовний доступ, в двійкових і байтових потоках можна використовувати обидва методи. Прямий доступ у поєднанні з відсутністю перетворень забезпечує високу швидкість обміну.

Методи форматованого введення для значень арифметичних типів в С# не підтримуються. Для перетворення з символьного в числове представлення використовуються методи класу Convert або метод Parse. Форматоване виведення виконується за допомогою перевантаженого методу ToString, результат виконання якого передається в методи текстових файлів.

Рекомендується завжди перевіряти успішність відкриття існуючого файлу, перехоплювати виключення, що виникають при перетворенні значень арифметичних типів, і явним чином закривати файл, в який виконувався запис.

Тривалі операції з файлами ефективніше виконувати в асинхронному режимі.

Для збереження об'єктів (серіалізація) використовується атрибут [ Serializable ]. Об'єкти можна зберігати в одному з двох форматів: двійковому або SOAP (у вигляді XML-файла).

РОЗДІЛ 12. ЗБІРКИ, БІБЛІОТЕКИ, АТРИБУТИ, ДИРЕКТИВИ

 

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

 

12.1. Збірки

В результаті компіляції в середовищі.NET створюється збірка - файл з розширенням ехе або dll, який містить код на проміжній мові, метадані типів, маніфест і ресурси (рис. 12.1)

 

Маніфест
Метадані
Код на мові IL
Ресурси (не обов'язково)

 

Рис. 12.1. Збірка, що складається з одного файлу

 

Проміжна мова (Intermediate Language, IL) не містить інструкцій, залежних від операційної системи і типу комп'ютера, що забезпечує дві основні можливості:

· виконання додатку на будь-якому типі комп'ютера, для якого існує середовище виконання CLR;

· повторне використання коду, написаного на будь-якій.NET- мові.

IL-код можна проглянути за допомогою дизасемблера ILDasm.exe, який знаходиться в папці...\SDK\bin\ каталога розміщення Visual Studio.NET. Після запуску ILDasm можна відкрити будь-який файл середовища.NET з розширенням ехе або dll; за допомогою команди File > Open. У вікні програми відкриється список всіх елементів збірки, відомості про кожне можна отримати подвійним клацанням. При цьому відкривається вікно, в якому для методів виводиться доступний для сприйняття дізасембльований код.

Метадані типів - це відомості про типи, використовувані в збірці. Компілятор створює метадані автоматично. У них міститься інформація про кожен тип, наявний в програмі, і про кожен його елемент. Наприклад, для кожного класу описуються всі його поля, методи, властивості, події, базові класи і інтерфейси.

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

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

Найчастіше збірка складається з єдиного файлу, проте вона може включати і декілька фізичних файлів (модулів). В цьому випадку маніфест або включається до складу одного з файлів, або міститься в окремому файлі. Багатофайлові збірки використовуються для прискорення завантаження додатку - це має сенс для збірок великого об'єму, робота з якими проводиться видалено.

На логічному рівні збірка є сукупністю взаємозв'язаних типів - класів, інтерфейсів, структур, перелічень, делегатів і ресурсів. Бібліотека.NET є сукупністю збірок, яку використовують додатки. Так само можна створювати і власні збірки, які можна буде використовувати або в рамках одного застосування (приватні збірки), або спільно різними застосуваннями (відкриті збірки). За умовчанням всі збірки є приватними.

Маніфест збірки містить:

· ідентифікатор версії;

· список всіх внутрішніх модулів збірки;

· список зовнішніх збірок, необхідних для нормального виконання збірки;

· інформацію про природну мову, використовувану в збірці (наприклад, російському);

· “сильне” ім'я (strong name) - спеціальний варіант імені збірки, використовуваний для відкритих збірок;

· необов'язкову інформацію, пов'язану з безпекою;

· необов'язкову інформацію, пов'язану із зберіганням ресурсів усередині збірки.

Ідентифікатор версії відноситься до всіх елементів збірки. Він дозволяє уникати конфліктів імен і підтримувати одночасне існування і використання різних версій одних і тих же збірок. Ідентифікатор версії складається з двох частин: інформаційної версії у вигляді текстового рядка і версії сумісності у вигляді чотирьох чисел, розділених крапками:

· основний номер версії (major version);

· додатковий номер версії (minor version);

· номер збірки (build number);

· номер ревізії (revision number).

Середовище виконання застосовує ідентифікатор версій для визначення того, які з відкритих збірок сумісні з вимогами клієнта. Наприклад, якщо клієнт запрошує збірку 3.1.0.0, а присутня тільки версія 3.4.0.0, збірка не буде пізнана як відповідна, оскільки вважається, що в додаткових версіях можуть відбутися зміни в типах і їх елементах. Різні номери ревізії допускають, але не гарантують сумісність. Номер збірки на сумісність не впливає, оскільки найчастіше він змінюється при установці патча (patch).

Ідентифікатор версії формується автоматично, але за бажання можна задати його вручну за допомогою атрибуту [ AssemblyVersion ], який розглядається далі.

Інформація про безпеку дозволяє визначити, чи надати клієнтові доступ до запрошуваних елементів збірки. У маніфесті збірки визначені обмеження системи безпеки.

Ресурси є, наприклад, файлами зображень, що поміщаються на форму, текстові рядки, значки додатку і так далі. Зберігання ресурсів усередині збірки забезпечує їх захист і спрощує розгортання додатку. Середовище Visual Studio.NET надає можливості автоматичного впровадження ресурсів в збірку.

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

Відкриті збірки розміщуються в спеціальному каталозі, який називається глобальним кешем збірок (Global Assembly Cache, GAC). Для ідентифікації відкритої збірки використовується вже згадуване сильне ім'я (strong name), яке має бути унікальним.

 

12.2. Створення бібліотеки

 

Для створення бібліотеки треба при розробці проекту в середовищі Visual Studio.NET вибрати шаблон Class Library (бібліотека класів). В розділі 8 була створена проста ієрархія класів персонажів комп'ютерної гри. У цьому розділі ми оформимо її у вигляді бібліотеки, тобто збірки з розширенням dll. Для збірки задано ім'я MonsterLib (рис. 12.2).

 

 

Рис. 12.2. Створення бібліотеки

 

Текст модуля приведений в лістингу 12.1. В порівнянні з модулем з розділу 8 в нього додані специфікатори доступу public для всіх трьох класів, що входять в бібліотеку.

 

Лістинг 12.1. Бібліотека монстрів

 

namespace MonsterLib

{

using System;

public abstract class Spirit

{

public abstract void Passport();

}

 

public class Monster: Spirit

{

public Monster()

{

this.name = "Noname";

this.health = 100;

this.ammo = 100;

}

 

public Monster(string name)

: this()

{

this.name = name;

}

public Monster(int health, int ammo, string name)

{

this.name = name;

this.health = health;

this.ammo = ammo;

}

 

public int Ammo

{

get { return ammo; }

set

{

if (value > 0) ammo = value; else ammo = 0;

}

}

public int Health

{

get { return health; }

set

{

if (value > 0) health = value; else health = 0;

}

}

 

override public void Passport()

{

Console.WriteLine("Monster {0} \t health = {1} ammo = {2}", name, health, ammo);

}

 

public string name; // закриті поля

public int health, ammo;

}

 

public class Daemon: Monster

{

public Daemon()

{

brain = 1;

}

 

public Daemon(string name, int brain)

: base(name) // 1

{

this.brain = brain;

}

 

public Daemon(int health, int ammo, string name, int brain)

: base(health, ammo, name)

{

this.brain = brain;

}

 

override public void Passport()

{

Console.WriteLine(

"Daemon {0} \t health = {1} ammo = {2} brain = {3}",

name, health, ammo, brain);

}

public void Think()

{

Console.Write(name + " is");

for (int i = 0; i < brain; ++i);

Console.Write(" thinking");

Console.WriteLine("...");

}

 

int brain; // закрите поле

}

}

 

Скомпілювавши бібліотеку, ви виявите файл Monsterlib.dll у каталогах ...\bin\ Debug і...\obj\Debug. Відкривши файл Monsterlib.dll за допомогою програми ILdasm.exe, можна отримати повну інформацію про створену бібліотеку (рис. 12.3).

 

 

Рис. 12.3. Перегляд бібліотеки за допомогою дизасемблера Lidasm.exe

 

Будь-яка бібліотека - це сервер, що надає свої ресурси клієнтам. Створимо клієнтське застосування, що виконує ті ж функції, що і додаток з розділу “Віртуальні методи” (див. розділ 8, лістінг 8.3), але з використанням бібліотеки Monsterlib.dll. Для того, щоб компілятор міг її виявити, необхідно після створення проекту (як завжди, це - консольний додаток) підключити посилання на бібліотеку за допомогою команди Project > Add Reference (Додати посилання). Для пошуку каталогу, що містить бібліотеку, слід використовувати кнопку Browse.

Після підключення бібліотеки можна користуватися її відкритими елементами таким же чином, неначебто вони були описані в тому ж модулі. Текст додатку приведений в лістингу 12.2.

 

Лістинг 12.2. Клієнтське застосування

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace exam100

{

using MonsterLib;

 

class Program

{

static void Main(string[] args)

{

const int n = 3;

Monster[] stado = new Monster[n];

stado[0] = new Monster("Monia");

stado[1] = new Monster("Monk");

stado[2] = new Daemon ("Dimon", 3);

foreach (Monster elem in stado) elem. Passport();

for (int i = 0; i < n; ++i) stado[i].Ammo = 0;

Console.WriteLine();

foreach (Monster elem in stado) elem.Passport();

}

}

}

 

Результат роботи програми:

Monster Monia health = 100 ammo = 100

Monster Monk health = 100 ammo = 100

Monster Dimon health = 100 ammo = 100 brain = 3;

 

Monster Monia health = 100 ammo = 0

Monster Monk health = 100 ammo = 0

Monster Dimon health = 100 ammo = 0 brain = 3;

 

Перевага.NET полягає в тому, що завдяки стандартним угодам можна використовувати бібліотеки незалежно від мови, на якій вони були написані. Таким чином, можна було б написати клієнтське застосування, наприклад, на мові VB.NET.

 

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. Результат роботи програми

 




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 1022; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.351 сек.