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);

После этой замены программа дает следующий результат.

Анализ методов, определенных в классе MyClass

Поддерживаемые методы:

Int32 Sum ()

Boolean IsBetween(Int32 i)

Void Set(Int32 a, Int32 b)

Void Set(Double a, Double b)

Void Show()

Как видите, теперь выводятся только те методы, которые явно определены в классе MyClass.

Вызов методов с помощью рефлексии

Как только методы, поддерживаемые определенным типом данных, становятся известны, их можно вызывать. Для этой цели служит метод Invoke (), входящий в состав класса Methodlnf о. Ниже приведена одна из форм этого метода:

object Invoke(object obj, object[] parameters)

где obj обозначает ссылку на объект, для которого вызывается метод. Для вызова статических методов (static) в качестве параметра obj передается пустое значение (null). Любые аргументы, которые должны быть переданы методу, указываются в массиве parameters. Если же аргументы не нужны, то вместо массива parameters указывается пустое значение (null). Кроме того, количество элементов массива parameters должно точно соответствовать количеству передаваемых

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату