Страница 257 из 502
<b> y = (int)b;</b>
<b> Show();</b>
<b> }</b>
<b> public void Show() {</b>
<b> Console.WriteLine("Значение x: {0}, значение у: {1}", x, y);</b>
<b> }</b>
<b>}</b>
<b>class InvokeMethDemo {</b>
<b> static void Main() {</b>
<b> Type t = typeof(MyClass);</b>
<b> MyClass reflectOb = new MyClass(10, 20);</b>
<b> int val;</b>
<b> Console.WriteLine("Вызов методов, определенных в классе " + t.Name);</b>
<b> Console.WriteLine();</b>
<b> MethodInfo[] mi = t.GetMethods();</b>
<b> // Вызвать каждый метод,</b>
<b> foreach (MethodInfo m in mi) {</b>
<b> // Получить параметры.</b>
<b> ParameterInfo[] pi = m.GetParameters();</b>
<b> if (m.Name.CompareTo("Set") == 0 && pi[0].ParameterType == typeof(int)) {</b>
<b> object[] args = new object[2];</b>
<b> args[0] = 9;</b>
<b> args[1] = 18;</b>
<b> m.Invoke(reflectOb, args);</b>
<b> }</b>
<b> else if (m.Name.CompareTo("Set") == 0 &&</b>
<b> pi[0].ParameterType == typeof(double)) {</b>
<b> object[] args = new object[2];</b>
<b> args[0] = 1.12;</b>
<b> args[1] = 23.4;</b>
<b> m.Invoke(reflectOb, args);</b>
<b> }</b>
<b> else if (m.Name.CompareTo("Sum") == 0) {</b>
<b> val = (int)m.Invoke(reflectOb, null);</b>
<b> Console.WriteLine("Сумма равна " + val);</b>
<b> }</b>
<b> else if (m.Name.CompareTo("IsBetween") == 0) {</b>
<b> object[] args = new object[1];</b>
<b> args[0] = 14;</b>
<b> if ((bool)m.Invoke(reflectOb, args))</b>
<b> Console.WriteLine("Значение 14 находится между x и у");</b>
<b> }</b>
<b> else if (m.Name.CompareTo("Show") == 0) {</b>
<b> m.Invoke(reflectOb, null);</b>
<b> }</b>
<b> }</b>
<b> }</b>
<b>}</b>
Вот к какому результату приводит выполнение этой программы.
<b>Вызов методов, определенных в классе MyClass</b>
<b>Сумма равна 30</b>
<b>Значение 14 находится между х и у</b>
<b>В методе Set (int, int). Значение х: 9, значение у: 18</b>
<b>В методе Set(double, double). Значение х: 1, значение у: 23</b>
<b>Значение х: 1, значение у: 23</b>
Рассмотрим подробнее порядок вызова методов. Сначала создается список методов. Затем в цикле foreach извлекаются сведения об их параметрах. Далее каждый метод вызывается с указанием соответствующего типа и числа аргументов в последовательном ряде условных операторов if/else. Обратите особое внимание на перегрузку метода Set() в приведенном ниже фрагменте кода.
<b>if(m.Name.CompareTo("Set")==0 &&</b>
<b> pi(0].ParameterType == typeof(int)) {</b>
<b> object[] args = new object[2];</b>
<b> args[0] = 9;</b>
<b> args[l] = 18;</b>
<b> m.Invoke(reflectOb, args);</b>
<b>}</b>
<b>else if(m.Name.CompareTo("Set")==0 &&</b>
<b> pi[0].ParameterType == typeof(double)) {</b>
<b> object[] args = new object[2];</b>
<b> args[0] = 1.12;</b>
<b> args[1 ] = 23.4;</b>
<b> m.Invoke(reflectOb, args);</b>
<b>}</b>
Если имя метода — Set, то проверяется тип первого параметра, чтобы выявить конкретный вариант этого метода. Так, если это метод Set(int, int), то его аргументы загружаются в массив args. В противном случае используются аргументы типа double.