В среде .NET
рефлексия – это процесс нахождения (обнаружения) и исследования внутренней
структуры сборок, структур и классов непосредственно в процессе работы
программы. То есть другими словами непосредственно в программе мы можем
получить, например, список всех типов, объявленных в модуле, список всех
методов, интерфейсов, полей и свойств этих типов, а также списки атрибутов,
примененных к различным элементам. Вся эта информация носит название
метаданных – данных о данных и описывается рядом специальных типов данных
(табл. 1).
Основные возможности, предоставляемые механизмом рефлексии, сосредоточены в
классах System.Type, System.Activator и System.Assembly и нескольких
вспомогательных типах расположенных в пространстве имен System.Reflection.
Таблица 1. Некоторые типы
метаданных
Имя класса |
Назначение и описание |
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). EN-US |