Рассмотрим эту программу более подробно. Прежде всего следует заметить, что в классе MyClassопределен открытый конструктор и ряд открытых методов, в том числе и перегружаемый метод Set().
Объект класса Туре, представляющий класс MyClass, создается в методе Main()в следующей строке кода.
Type t = typeof(MyClass); // получить объект класса Туре,
// представляющий класс MyClass
Напомним, что оператор typeofвозвращает объект класса Туре, представляющий конкретный тип данных (в данном случае — класс MyClass).
С помощью переменной t и прикладного интерфейса Reflection API в данной программе затем выводятся сведения о методах, поддерживаемых в классе MyClass. Для этого в приведенной ниже строке кода сначала выводится список соответствующих методов.
MethodInfo[] mi = t.GetMethods();
Затем в цикле foreachорганизуется обращение к элементам массива mi. На каждом шаге этого цикла выводится возвращаемый тип, имя и параметры отдельного метода, как показано в приведенном ниже фрагменте кода.
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(", ");
}
}
В этом фрагменте кода параметры, связанные с каждым методом, сначала создаются с помощью метода GetParameters()и сохраняются в массиве pi. Затем в цикле forпроисходит обращение к элементам массива pinвыводится тип и имя каждого параметра. Самое главное, что все эти сведения создаются динамически во время выполнения программы, не опираясь на предварительную осведомленность о классе MyClass.
Вторая форма метода GetMethods()
Существует вторая форма метода GetMethods(), позволяющая указывать различные флажки для отфильтровывания извлекаемых сведений о методах. Ниже приведена эта общая форма метода GetMethods().
MethodInfo[] GetMethods(BindingFlags флажки)
В этом варианте создаются только те методы, которые соответствуют указанным критериям. BindingFlagsпредставляет собой перечисление. Ниже перечислен ряд наиболее часто используемых его значений.
Значение - Описание
DeclaredOnly- Извлекаются только те методы, которые определены в заданном классе. Унаследованные методы в извлекаемые сведения не включаются
Instance- Извлекаются методы экземпляра
NonPublic- Извлекаются методы, не являющиеся открытыми
Public- Извлекаются открытые методы
Static- Извлекаются статические методы
Два или несколько флажков можно объединить с помощью логической операции ИЛИ. Но как минимум флажок Instanceили Staticследует указывать вместе с флажком Publicили NonPublic. В противном случае не будут извлечены сведения ни об одном из методов.
Форма BindingFlagsметода GetMethods()чаще всего применяется для получения списка методов, определенных в классе, без дополнительного извлечения наследуемых методов. Это особенно удобно в тех случаях, когда требуется исключить получение сведений о методах, определяемых в классе конкретного объекта. В качестве примера попробуем выполнить следующую замену в вызове метода GetMethods()из предыдущей программы.
// Теперь получаются сведения только о тех методах,
// которые объявлены в классе MyClass.
MethodInfo[] 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о. Ниже приведена одна из форм этого метода:
Читать дальше