Добавить в цитаты Настройки чтения

Страница 257 из 502

<b>    y = (int)b;</b>

<b>    Show();</b>

<b>  }</b>

<b>  public void Show() {</b>

<b>    Console.WriteLine(&quot;Значение x: {0}, значение у: {1}&quot;, 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(&quot;Вызов методов, определенных в классе &quot; + 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(&quot;Set&quot;) == 0 &amp;&amp; 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(&quot;Set&quot;) == 0 &amp;&amp;</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(&quot;Sum&quot;) == 0) {</b>

<b>        val = (int)m.Invoke(reflectOb, null);</b>

<b>        Console.WriteLine(&quot;Сумма равна &quot; + val);</b>

<b>      }</b>

<b>      else if (m.Name.CompareTo(&quot;IsBetween&quot;) == 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(&quot;Значение 14 находится между x и у&quot;);</b>

<b>      }</b>

<b>      else if (m.Name.CompareTo(&quot;Show&quot;) == 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(&quot;Set&quot;)==0 &amp;&amp;</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(&quot;Set&quot;)==0 &amp;&amp;</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.