Получение сведений о методах
Имея в своем распоряжении объект класса Туре, можно получить список методов, поддерживаемых отдельным типом данных, используя метод 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);
if (i + 1 < pi.Length) Console.Write(", ");
}
Console.WriteLine(")");
Console.WriteLine();
}
}
}
Эта программа дает следующий результат.
Поддерживаемые методы:
Int32 Sum()
Boolean IsBetween (Int32 i)
Void Set(Int32 a, Int32 b)
Void Set (Double a, Double b)'
Void Show()
String ToString()
Boolean Equals(Object ob j )
Int32 GetHashCode()
Type GetType()
Как видите, помимо методов, определенных в классе MyClass, в данной программе выводятся также методы, определенные в классе object, поскольку все типы данных в C# наследуют от класса object. Кроме того, в качестве имен типов указываются имена структуры .NET. Обратите также внимание на то, что метод Set()выводится дважды, поскольку он перегружается. Один из его вариантов принимает аргументы типа int, а другой — аргументы типа double.
Читать дальше