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. Подключение внешней сборки к основной программе с помощью рефлексии

 


Связанные темы