Для вызова конкретного метода достаточно вызвать метод Invoke для экзем пляра объекта типа MethodInfo, получаемого при вызове метода 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(MethodInfo m in mi) { // Получить параметры. ParameterInfo[] pi = m.GetParameters; if(m.Name.CompareTo("Set")==0 && pi[0].ParameterType == typeof(int)) { object[] args = new object[2]; args[0] = 9; args[1] = 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 и у"); } else if(m.Name.CompareTo("Show")==0) { m.Invoke(reflectOb, null); } } } }
Вот к какому результату приводит выполнение этой программы. Вызов методов, определенных в классе MyClass Сумма равна 30 Значение 14 находится между х и у В методе Set(int, int). Значение х: 9, значение у: 18 В методе Set(double, double). Значение х: 1, значение у: 23 Значение х: 1, значение у: 23
Рассмотрим подробнее порядок вызова методов. Сначала создается список методов. Затем в цикле foreach извлекаются сведения об их параметрах. Далее каждый метод вызывается с указанием соответствующего типа и числа аргументов в последователь ном ряде условных операторов if/else. Обратите особое внимание на перегрузку ме тода Set в приведенном ниже фрагменте кода. if(m.Name.CompareTo("Set")==0 && pi[0].ParameterType == typeof(int)) { object[] args = new object[2]; args[0] = 9; args[1] = 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); }
Если имя метода — Set, то проверяется тип первого параметра, чтобы выявить конкретный вариант этого метода. Так, если это метод Set(int, int), то его аргу менты загружаются в массив args. В противном случае используются аргументы типа double. Получение конструкторов конкретного типа
В предыдущем примере при вызове методов, определенных в классе MyClass, пре имущества рефлексии не использовались, поскольку объект типа MyClass создавал ся явным образом. В таком случае было бы намного проще вызвать для него методы обычным образом. Но сильные стороны рефлексии проявляются наиболее заметно лишь в том случае, если объект создается динамически во время выполнения. И для этого необходимо получить сначала список конструкторов, а затем экземпляр объекта заданного типа, вызвав один из этих конструкторов. Такой механизм позволяет полу чать во время выполнения экземпляр объекта любого типа, даже не указывая его имя в операторе объявления.
Конструкторы конкретного типа получаются при вызове метода GetConstructors для объекта класса Туре. Ниже приведена одна из наиболее ча сто используемых форм этого метода. ConstructorInfо[] GetConstructors
Метод GetConstructors возвращает массив объектов класса ConstructorInfо, описывающих конструкторы.