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

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

<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;Вызов методов для объекта reflectOb.&quot;); 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>Найдено: MyClass</b>

<b>Найдено: AnotherClass</b>

<b>Найдено: Demo</b>

<b>Использовано: MyClass</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>

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

<b>Значение х: 1, значение у: 2 3</b>

Как следует из результата выполнения приведенной выше программы, обнаружены все три класса, содержащиеся в файле сборки МуСlasses.ехе. Первым среди них обнаружен класс MyClass, который затем был использован для получения экземпляра объекта и вызова соответствующих методов.

Отдельные типы обнаруживаются в сборке MyClasses.ехе с помощью приведенной ниже последовательности кода, находящегося в самом начале методачМаin().

<b>// Загрузить сборку MyClasses.exe.</b>

<b>Assembly asm = Assembly.LoadFrom(&quot;MyClasses.ехе&quot;) ;</b>

<b>// Обнаружить типы, содержащиеся в сборке MyClasses.exe.</b>

<b>Туре[] alltypes = asm.GetTypes();</b>

<b>foreach(Type temp in alltypes)</b>