C#. .NET. Приклади застосування рефлексії на основі пізнього зв’язування

Приклади застосування рефлексії на основі пізнього зв’язування

Дана тема є продовженням наступних тем:


Зміст


Пошук на інших ресурсах:




1. Приклади застосування рефлексії на основі механізму пізнього зв’язування

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

  1. Нехай у програмі виникла ситуація, коли отримано об’єкт з зовнішьного носія, який не знаходиться в просторі імен нашої програми. Такий об’єкт може бути отриманий у вигляді послідовності байт з деякого мережного з’єднання. Відомо тільки, що цей об’єкт є класом. Виникає задача визначити складові цього класу, на основі складових сформувати екземпляр класу та запустити необхідні методи.
  2. Рефлексія ефективна при компонентному програмуванні в системах швидкої розробки додатків (RAD – Rapid Application Development). У таких системах компоненти, які додаються до програми чи форми представлені у вигляді піктограм, значків тощо. За розміщеним компонентом підвантажується відповідний програмний код, що задає функціонал цього компонента. З допомогою рефлексії можна динамічно під час виконання програми додати цей функціонал.
  3. Можливість створення та використання об’єктів на віддалених платформах. Така можливість називається віддалений виклик методів (Remote Method Invocation, RMI). Об’єкти розподіляються по декільком комп’ютерам. Комп’ютер, що використовує віддалений об’єкт, використовує цей об’єкт шляхом рефлексії.
  4. Майже всі сучасні фреймворки .NET працюють на основі рефлексії.
  5. Сама утиліта ildasm.exe підвантажує збірку, визначає в ній методи, їх параметри тощо. Для визначення метаданих збірки утиліта використовує рефлексію.
  6. З допомогою рефлексії програма може змінювати свою структуру додаючи до її функціоналу додаткові модулі.
  7. Рефлексія широко застосовується в .NET для отримання інформації про атрибути класів. Наприклад, можлива ситуація коли потрібно визначити, чи підтримує об’єкт деякого класу серіалізацію/десеріалізацію. Для цього визначається наявність (відсутність) в класі атрибуту Serializable.
  8. В сучасних системах візуальної розробки застосунків існує підтримка їх модифікації шляхом додавання нових компонент. Наприклад, в системі програмування Delphi є можливість розробити власний компонент, сформувати цей компонент в об’єктний модуль (*.DCL – те саме що *.DLL) і додати цей компонент в палітру компонент Delphi. Система з допомогою рефлексії визначить типи, назви типів, складові цих типів, що використвовуються у компоненті. Після закриття та наступного запуску системи візуальної розробки додатків Delphi цей компонент вже буде підвантажуватись автоматично, оскільки інформація про нього буде збережена в файлах конфігурації Delphi.

 

2. Пізнє зв’язування. Приклад отримання деякого об’єкту з мережі та його використання. Рисунок

На рисунку 1 зображено одну з особливостей рефлексії, яка визначає внутрішній склад об’єкту на основі механізму пізнього зв’язування

Нехай при виконанні програми, з зовнішнього середовища було отримано деякий об’єкт SomeObject. Інформація про вміст об’єкту невідома. Завдяки використанню рефлексії існує можливість:

  • отримати виключну інформацію про типи, що реалізовані в об’єкті;
  • запустити на виконання методи об’єкту.

C# .NET. Рефлексія. Інспектування об’єкту з допомогою рефлексії

Рисунок 1. Інспектування об’єкту з допомогою рефлексії

 

3. Пізнє зв’язування. Приклад включення типів з іншої збірки. Рисунок

З допомогою механізму пізнього зв’язування можна визначати складові інших збірок. На рисунку 2 зображено приклад отримання даних з іншої збірки. Нехай задано деяке файлове сховище, яке містить деяку збірку з іменем SomeAssembly.dll. Вміст збірки невідомий. Завдяки рефлексії вдається визначити внутрішній вміст збірки та додати його в програму: типи (класи, інтерфейси, структури тощо) та елементи в цих типах (методи, властивості, внутрішні поля і т.д.).

C# .NET. Підключення зовнішньої збірки до основної програми з допомогою рефлексії

Рисунок 2. Підключення зовнішньої збірки до основної програми з допомогою рефлексії

 


Зв’язані теми