С помощью методов и свойств класса Туре
можно получить подробные сведения о типе данных во время выполнения программы. Это довольно эффективное средство. Ведь получив сведения о типе данных, можно сразу же вызвать его конструкторы и методы или воспользоваться его свойствами. Следовательно, рефлексия позволяет использовать код, который не был доступен во время компиляции.
Прикладной интерфейс Reflection API весьма обширен и поэтому не может быть полностью рассмотрен в этой главе. Ведь для этого потребовалась бы целая книга! Но прикладной интерфейс Reflection API имеет ясную логическую структуру, а следовательно, уяснив одну его часть, нетрудно понять и все остальное. Принимая во внимание это обстоятельство, в последующих разделах демонстрируются четыре основных способа применения рефлексии: получение сведений о методах, вызов методов, конструирование объектов и загрузка типов данных из сборок.
Имея в своем распоряжении объект класса Туре
, можно получить список методов, поддерживаемых отдельным типом данных, используя метод GetMethods()
. Ниже приведена одна из форм, подходящих для этой цели.
MethodInfo[] GetMethods()
Этот метод возвращает массив объектов класса Methodlnfо
, которые описывают методы, поддерживаемые вызывающим типом. Класс MethodInfo
находится в пространстве имен System.Reflection
.
Класс MethodInfo
является производным от абстрактного класса MethodBase
, который в свою очередь наследует от класса MemberInfо
. Это дает возможность пользоваться всеми свойствами и методами, определенными в этих трех классах. Например, для получения имени метода служит свойство Name
. Особый интерес вызывают два члена класса MethodInfo
: ReturnType
и GetParameters()
.
Возвращаемый тип метода находится в доступном только для чтения свойстве ReturnType
, которое является объектом класса Туре.
Метод GetParameters()
возвращает список параметров, связанных с анализируемым методом. Ниже приведена его общая форма.
Parameterlnfо[] GetParameters();
Сведения о параметрах содержатся в объекте класса ParameterInfо
. В классе Parameterlnfо
определено немало свойств и методов, описывающих параметры. Особое значение имеют два свойства: Name
— представляет собой строку, содержащую имя параметра, a ParameterType
— описывает тип параметра, который инкапсулирован в объекте класса Туре
.
В качестве примера ниже приведена программа, в которой рефлексия используется для получения методов, поддерживаемых классом MyClass
. В этой программе выводится возвращаемый тип и имя каждого метода, а также имена и типы любых параметров, которые может иметь каждый метод.
// Анализ методов с помощью рефлексии.
using System;
using System.Reflection;
class MyClass {
int x;
int y;
public MyClass(int i, int j) {
x = i;
y = j;
}
public int Sum() {
return x + y;
}
public bool IsBetween(int i) {
if (x < i && i < y) return true;
else return false;
}
public void Set(int a, int b) {
x = a;
y = b;
}
public void Set(double a, double b) {
x = (int)a; y = (int)b;
}
public void Show() {
Console.WriteLine(" x: {0}, у: {1}", x, y);
}
}
class ReflectDemo {
static void Main() {
Type t = typeof(MyClass); // получить объект класса Type,
// представляющий класс MyClass
Console.WriteLine("Анализ методов, определенных " +
"в классе " + t.Name);
Console.WriteLine();
Console.WriteLine("Поддерживаемые методы: ");
MethodInfo[] mi = t.GetMethods();
// Вывести методы, поддерживаемые в классе MyClass.
foreach (MethodInfo m in mi) {
// Вывести возвращаемый тип и имя каждого метода.
Console.Write(" " + m.ReturnType.Name + " " + m.Name + "(");
// Вывести параметры.
ParameterInfo[] pi = m.GetParameters();
for (int i = 0; i < pi.Length; i++) {
Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);