Возвращаемый тип метода находится в доступном только для чтения свойстве ReturnType, которое является объектом класса Туре.

Метод GetParameters () возвращает список параметров, связанных с анализируемым методом. Ниже приведена его общая форма.

Parameterlnfо[] GetParameters();

Сведения о параметрах содержатся в объекте класса Parameter Inf о. В классе Parameterlnf о определено немало свойств и методов, описывающих параметры. Особое значение имеют два свойства: Name — представляет собой строку, содержащую имя параметра, a ParameterType — описывает тип параметра, который инкапсулирован в объекте класса Туре.

В качестве примера ниже приведена программа, в которой рефлексия используется для получения методов, поддерживаемых классом MyClass. В этой программе выводится возвращаемый тип и имя каждого метода, а также имена и типы любых параметров, которые может иметь каждый метод.

// Анализ методов с помощью рефлексии.

Using System;

Using System.Reflection;

class MyClass { int x; int y;

public MyClass(int i, int j) { x = i ;

У = 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;

У = b;

}

public void Set(double a, double b) { x = (int) a; у = (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(Methodlnfo m in mi) {

// Вывести возвращаемый тип и имя каждого метода.

Console.Write(" " + m.ReturnType.Name + " " + m.Name + "(");

// Вывести параметры.

Parameterlnfo[] pi = m.GetParameters() ; for(int i=0; i < pi.Length; i++) {

Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name); if(i+l < 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, в данной программе выводятся также методы, определенные в классе ob j ect, поскольку все типы данных в C# наследуют от класса ob j ect. Кроме того, в качестве имен типов указываются имена структуры .NET. Обратите также внимание на то, что метод Set () выводится дважды, поскольку он перегружается. Один из его вариантов принимает аргументы типа int, а другой — аргументы типа double.

Рассмотрим эту программу более подробно. Прежде всего следует заметить, что в классе MyClass определен открытый конструктор и ряд открытых методов, в том числе и перегружаемый метод Set ().

Объект класса Туре, представляющий класс MyClass, создается в методе Main () в следующей строке кода.

Type t = typeof(MyClass); // получить объект класса Туре,

// представляющий класс MyClass

Напомним, что оператор typeof возвращает объект класса Туре, представляющий конкретный тип данных (в данном случае — класс MyClass).

С помощью переменной t и прикладного интерфейса Reflection API в данной программе затем выводятся сведения о методах, поддерживаемых в классе MyClass. Для этого в приведенной ниже строке кода сначала выводится список соответствующих методов.

MethodInfo[] mi = t.GetMethods();

Затем в цикле foreach организуется обращение к элементам массива mi. На каждом шаге этого цикла выводится возвращаемый тип, имя и параметры отдельного метода, как показано в приведенном ниже фрагменте кода.

foreach(Methodlnfo m in mi) {

// Вывести возвращаемый тип и имя каждого метода.

Console.Write(" " + m.ReturnType.Name + " " + m.Name + "(");

// Вывести параметры.

Parameterlnfo[] 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(", ");

В этом фрагменте кода параметры, связанные с каждым методом, сначала создаются с помощью метода GetParameters () и сохраняются в массиве pi. Затем в цикле for происходит обращение к элементам массива pin выводится тип и имя каждого параметра. Самое главное, что все эти сведения создаются динамически во время выполнения программы, не опираясь на предварительную осведомленность о классе MyClass.

Вторая форма метода GetMethods ()

Существует вторая форма метода GetMethods () , позволяющая указывать различные флажки для отфильтровывания извлекаемых сведений о методах. Ниже приведена эта общая форма метода GetMethods ().

Methodlnfo[] GetMethods(BindingFlags флажки)

В этом варианте создаются только те методы, которые соответствуют указанным критериям. BindingFlags представляет собой перечисление. Ниже перечислен ряд наиболее часто используемых его значений.

 

Значение

 

Описание

 

DeclaredOnly

 

Извлекаются только те методы, которые определены в заданном классе. Унаследованные методы в извлекаемые сведения не включаются

 

Instance

 

Извлекаются методы экземпляра

 

NonPublic

 

Извлекаются методы, не являющиеся открытыми

 

Public

 

Извлекаются открытые методы

 

Static

 

Извлекаются статические методы

 

Два или несколько флажков можно объединить с помощью логической операции ИЛИ. Но как минимум флажок Instance или Static следует указывать вместе с флажком Public или Non Pub lie. В противном случае не будут извлечены сведения ни об одном из методов.

Форма BindingFlags метода GetMethods () чаще всего применяется для получения списка методов, определенных в классе, без дополнительного извлечения наследуемых методов. Это особенно удобно в тех случаях, когда требуется исключить получение сведений о методах, определяемых в классе конкретного объекта. В качестве примера попробуем выполнить следующую замену в вызове метода GetMethods () из предыдущей программы.

// Теперь получаются сведения только о тех методах,

// которые объявлены в классе MyClass.

Methodlnfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly |

BindingFlags.Instance |

BindingFlags.Public);