Страница 262 из 502
<b> if (x == ci.Length) {</b>
<b> Console.WriteLine("Подходящий конструктор не найден.");</b>
<b> return;</b>
<b> }</b>
<b> else</b>
<b> Console.WriteLine("Найден конструктор с двумя параметрами.n");</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("Вызов методов для объекта reflectOb."); 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 &&</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("Set") == 0 &&</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("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>Найдено: 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("MyClasses.ехе") ;</b>
<b>// Обнаружить типы, содержащиеся в сборке MyClasses.exe.</b>
<b>Туре[] alltypes = asm.GetTypes();</b>
<b>foreach(Type temp in alltypes)</b>