C# 4.0 полное руководство - 2011
Шрифт:
Значение
Описание
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 должно точно соответствовать количеству передаваемых аргументов. Так, если требуется передать два аргумента, то массив parameters должен состоять из двух элементов, но не из трех или четырех. Значение, возвращаемое вызываемым методом, передается методу Invoke , который и возвращает его.
Для вызова конкретного метода достаточно вызвать метод Invoke для экземпляра объекта типа Methodlnf о, получаемого при вызове метода GetMethods . Эта процедура демонстрируется в приведенном ниже примере программы.
// Вызвать методы с помощью рефлексии.
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) {
Console.Write("В методе Set (int, int). ") ; x = a;
У = b;
Show;
}
// Перегрузить метод Set.
public void Set(double a, double b) {
Console.Write("В методе Set(double, double). "); x = (int) a; у = (int) b;
Show ;
}
public void Show {
Console.WriteLine("Значение x: {0}, значение у: {1}", x, у);
}
}
class InvokeMethDemo { static void Main {
Type t = typeof(MyClass);
MyClass reflectOb = new MyClass(10, 20); int val;
Console.WriteLine("Вызов методов, определенных в классе " + t.Name); Console.WriteLine;
MethodInfo[] mi = t.GetMethods;
// Вызвать каждый метод, foreach(Methodlnfo m in mi) {
// Получить параметры.
Parameterlnfo[] pi = m.GetParameters ;
if(m.Name.CompareTo("Set")==0 &&
pi[0].ParameterType == typeof(int)) { object[] args = new object[2]; args[0] = 9; args[l] = 18;
m. Invoke(reflectOb, args);
}
else if(m.Name.CompareTo("Set") ==0 &&
pi[0].ParameterType == typeof(double)) {
object[] args = new object[2]; args[0] = 1.12; args[1] = 23.4; m. Invoke(reflectOb, args);