Страница 261 из 502
<b> if ((x < i) && (i < y)) return true;</b>
<b> else return false;</b>
<b> }</b>
<b> public void Set(int a, int b) {</b>
<b> Console.Write("В методе Set(int, int). ");</b>
<b> x = a;</b>
<b> y = b;</b>
<b> Show();</b>
<b> }</b>
<b> // Перегрузить.метод Set.</b>
<b> public void Set(double a, double b) {</b>
<b> Console.Write("В методе Set(double, double). ");</b>
<b> x = (int)a;</b>
<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 AnotherClass {</b>
<b> string msg;</b>
<b> public AnotherClass(string str) {</b>
<b> msg = str;</b>
<b> }</b>
<b> public void Show() {</b>
<b> Console.WriteLine(msg);</b>
<b> }</b>
<b>}</b>
<b>class Demo {</b>
<b> static void Main() {</b>
<b> Console.WriteLine("Это заполнитель.");</b>
<b> }</b>
<b>}</b>
Этот файл содержит класс MyClass, неоднократно использовавшийся в предыдущих примерах. Кроме того, в файл добавлены второй класс AnotherClass и третий класс Demo. Следовательно, сборка, полученная из исходного кода, находящегося в этом исходном файле, будет содержать три класса. Затем этот файл компилируется, и из него формируется исполняемый файл MyClasses.ехе. Именно эта сборка и будет опрашиваться программно.
Ниже приведена программа, в которой будут извлекаться сведения о файле сборки MyClasses.ехе. Ее исходный текст составляет содержимое второго файла.
<b>/* Обнаружить сборку, определить типы и создать объект с помощью рефлексии. */</b>
<b>using System;</b>
<b>using System.Reflection;</b>
<b>class ReflectAssemblyDemo {</b>
<b> static void Main() {</b>
<b> int val;</b>
<b> // Загрузить сборку MyClasses.exe.</b>
<b> Assembly asm = Assembly.LoadFrom("MyClasses.exe");</b>
<b> // Обнаружить типы, содержащиеся в сборке MyClasses.exe.</b>
<b> Type[] alltypes = asm.GetTypes();</b>
<b> foreach (Type temp in alltypes)</b>
<b> Console.WriteLine("Найдено: " + temp.Name);</b>
<b> Console.WriteLine();</b>
<b> // Использовать первый тип, в данном случае — класс MyClass.</b>
<b> Type t = alltypes[0]; // использовать первый найденный класс</b>
<b> Console.WriteLine("Использовано: " + t.Name);</b>
<b> // Получить сведения о конструкторе.</b>
<b> ConstructorInfo[] ci = t.GetConstructors();</b>
<b> Console.WriteLine("Доступные конструкторы: ");</b>
<b> foreach (ConstructorInfo с in ci) {</b>
<b> // Вывести возвращаемый тип и имя.</b>
<b> Console.Write(" " + t.Name + "(");</b>
<b> // Вывести параметры.</b>
<b> ParameterInfo[] pi = с.GetParameters();</b>
<b> for (int i = 0; i < pi.Length; i++) {</b>
<b> Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);</b>
<b> if (i + 1 < pi.Length) Console.Write(", ");</b>
<b> }</b>
<b> Console.WriteLine(")");</b>
<b> }</b>
<b> Console.WriteLine();</b>
<b> // Найти подходящий конструктор,</b>
<b> int x;</b>
<b> for (x = 0; x < ci.Length; x++) {</b>
<b> ParameterInfo[] pi = ci[x].GetParameters();</b>
<b> if (pi.Length == 2) break;</b>
<b> }</b>