где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);

}

else if(m.Name.CompareTo("Sum")==0)    {

val = (int) m.Invoke(reflectOb, null);

Console.WriteLine("Сумма равна " + val);

}

else if(m.Name.CompareTo("IsBetween")==0)    {

object[] args = new object[1]; args[0] = 14;

if((bool) m.Invoke(reflectOb, args))

Console.WriteLine("Значение 14 находится между x и у");

}

Перейти на страницу:

Похожие книги