1. Назначение рефлексии и ее использование в задачах позднего связывания
В среде .NET рефлексия – это процесс нахождения (обнаружения) и исследования внутренней структуры сборок, структур и классов непосредственно в процессе работы программы. То есть другими словами непосредственно в программе мы можем получить, например, список всех типов, объявленных в модуле, список всех методов, интерфейсов, полей и свойств этих типов, а также списки атрибутов, примененных к различным элементам. Вся эта информация носит название метаданных – данных о данных.
Основные возможности, предоставляемые механизмом рефлексии, сосредоточены в классах System.Type, System.Activator и System.Assembly и нескольких вспомогательных типах расположенных в пространстве имен System.Reflection.
Имя класса |
Назначение и описание |
MethodInfo |
Предоставляет информацию о методе класса или структуры данных. О количестве параметров, их типах, типе возвращаемого значения и т.д. |
ParameterInfo |
Описывает параметр, передаваемый в метод класса (его тип, имя, порядковый номер в списке параметров). |
PropertyInfo |
Описывает характеристики свойства класса (тип, имя, возможность чтения/записи и т.д.). |
Пример программы, в которой используются средства рефлексии для получения методов, описанных в классе MyClass. Для каждого метода выводится его имя и тип:
using System;
using System.Reflection;
class MyClass {
- int x;
- int y;
- public MyClass(int i, int j) { this.x = i; this.y = j; }
- public int sum() { return x+y; }
- public void set(double a, double b) { x = (int) a; y = (int) b; }
}
- class ReflectDemo {
- public static void Main() {
- // Получаем Type-объект, описывающий MyClass
- Type t = typeof(MyClass);
- Console.WriteLine("Поддерживаемые методы: " ) ;
- foreach(Methodinfо m in t.GetMethods())
- // Отображаем тип результата и имя метода
- Console.Write(" {0} {1}(…)", m.ReturnType.Name, m.Name) ;
} //Main
- } //ReflectDemo
Зная, какие методы поддерживает тип, можно вызвать любой из них. Для этого используется метод, определенный в классе MethodInfo как
object Invoke(object ob, object[] args), где obj соответствует объекту, для которого вызывается метод (аналог параметра this), а args – набору аргументов, передаваемых в метод. Причем, если метод не имеет аргументов, параметр args должен быть представлен массивом нулевой длины (а не значением null).
ЗАДАНИЕ 1.
- Описать класс MyClass, который будет содержать:
- поля различных типов и различным уровнем доступа;
- методы, с различным набором аргументов и различным типом возвращаемого значения.
- Объявить класс MyTestClass, который будет содержать методы выполняющие следующие действия:
- выводить по имени класса имена методов, которые содержат строковые параметры (имя класса передается в качестве аргумента);
- вызывать некоторый метод класса, при этом значения для его параметров необходимо прочитать из текстового файла (имя класса и имя метода передаются в качестве аргументов).
ЗАДАНИЕ 2
- Расположить класс MyClass в отдельном .cs-файле и дополнить его следующими членами:
- перегрузить конструктор: один конструктор без параметров, другой с параметрами;
- объявить два интерфейса (IInterface1 и IInterface2) как минимум с двумя методами каждый и реализовать их
- одно из полей объявить как static
В классе MyTestClass реализовать метод (принимающий в качестве параметра имя класса), который выводит всё содержимое класса в текстовый файл;
Реализовать метод (принимающий в качестве параметра имя класса), который записывает все члены класса в файл *.cs, который должен правильно компилироваться в среде .NET.
|