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

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

<b>      // Вывести возвращаемый тип и имя. </b>

<b>      Console.Write(&quot; &quot; + t.Name + &quot;(&quot;);</b>

<b>      // Вывести параметры. </b>

<b>      ParameterInfo[] pi = с.GetParameters();</b>

<b>      for (int i = 0; i &lt; pi.Length; i++) {</b>

<b>        Console.Write(pi[i].ParameterType.Name + &quot; &quot; + pi[i].Name);</b>

<b>        if (i + 1 &lt; pi.Length) Console.Write(&quot;, &quot;);</b>

<b>      }</b>

<b>      Console.WriteLine(&quot;)&quot;);</b>

<b>    }</b>

<b>    Console.WriteLine();</b>

<b>    // Найти подходящий конструктор,</b>

<b>    int x; </b>

<b>    for (x = 0; x &lt; ci.Length; x++) {</b>

<b>      ParameterInfo[] pi = ci[x].GetParameters();</b>

<b>      if (pi.Length == 2) break;</b>

<b>    }</b>

<b>    if (x == ci.Length) {</b>

<b>      Console.WriteLine(&quot;Подходящий конструктор не найден.&quot;);</b>

<b>      return;</b>

<b>    }</b>

<b>    else</b>

<b>      Console.WriteLine(&quot;Найден конструктор с двумя параметрами.n&quot;);</b>

<b>    // Сконструировать объект, </b>

<b>    object[] consargs = new object[2];</b>

<b>    consargs[0] = 10;</b>

<b>    consargs[1] = 20;</b>

<b>    object reflectOb = ci[x].Invoke(consargs);</b>

<b>    Console.WriteLine(&quot;nВызов методов для объекта reflectOb.&quot;);</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;</b>

<b>                    pi[0].ParameterType == typeof(int)) {</b>

<b>        // Это метод Set(int, 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>        // Это метод Set(double, 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>Доступные конструкторы:</b>

<b>MyClass(Int32 i)</b>

<b>MyClass(Int32 i, Int32 j)</b>

<b>Найден конструктор с двумя параметрами.</b>

<b>Конструирование класса MyClass(int, int)</b>

<b>Значение х: 10, значение у: 20</b>

<b>Вызов методов для объекта reflectOb</b>

<b>Сумма равна 30</b>

<b>Значение 14 находится между х и у</b>

<b>В методе Set(int, int). Значение х: 9, значение у: 18</b>