Как только будет получен объект класса Assembly, появится возможность обнаружить определенные в нем типы данных, вызвав для него метод Get Types () в приведенной ниже общей форме.
Туре [ ] GetTypesO
Этот метод возвращает массив типов, содержащихся в сборке.
Для того чтобы продемонстрировать порядок обнаружения типов в сборке, потребуются два исходных файла. Первый файл будет содержать ряд классов, обнаруживаемых в коде из второго файла. Создадим сначала файл MyClasses . cs, содержащий следующий код.
// Файл, содержащий три класса и носящий имя MyClasses.cs.
Using System;
class MyClass { int x; int y;
public MyClass(int i) {
Console.WriteLine("Конструирование класса MyClass(int). "); x = у = i ;
Show () ;
}
public MyClass(int i, int j) {
Console.WriteLine("Конструирование класса MyClass(int, int). ") ; x = i;
у = j;
Show();
}
public int Sum() { return x+y;
}
public bool IsBetween(int i) {
if ( (x < i) && (i < y)) return true;
else return false; \
}
public void Set(int a, int b) {
Console.Write("В методе Set(int, int). "); x = a;
У = b;
Show();
}
// Перегрузить.метод Set.
public void Set(double a, double b) {
Console.Write("В методе Set(double, double). "); x = (int) a; у = (int) b;
Show () ;
}
public void Show() {
Console.WriteLine ("Значение x: {0}, значение у: {1}", x, у);
}
}
class AnotherClass { string msg;
public AnotherClass(string str) { msg = str;
}
public void Show() {
Console.WriteLine(msg);
class Demo {
static void Main() {
Console.WriteLine("Это заполнитель.");
}
}
Этот файл содержит класс MyClass, неоднократно использовавшийся в предыдущих примерах. Кроме того, в файл добавлены второй класс AnotherClass и третий класс Demo. Следовательно, сборка, полученная из исходного кода, находящегося в этом исходном файле, будет содержать три класса. Затем этот файл компилируется, и из него формируется исполняемый файл MyClasses . ехе. Именно эта сборка и будет опрашиваться программно.
Ниже приведена программа, в которой будут извлекаться сведения о файле сборки MyClasses . ехе. Ее исходный текст составляет содержимое второго файла.
/* Обнаружить сборку, определить типы и создать объект с помощью рефлексии. */
Using System;
Using System.Reflection;
class ReflectAssemblyDemo { static void Main() { int val;
// Загрузить сборку MyClasses.exe.
Assembly asm = Assembly.LoadFrom("MyClasses.exe");
// Обнаружить типы, содержащиеся в сборке MyClasses.exe.
Туре[] alltypes = asm.GetTypes(); foreach(Type temp in alltypes)
Console.WriteLine("Найдено: " + temp.Name);
Console.WriteLine() ;
// Использовать первый тип, в данном случае — класс MyClass.
Type t = alltypes[0]; // использовать первый найденный класс Console.WriteLine("Использовано: " + t.Name);
// Получить сведения о конструкторе.
Constructorlnfo[] ci = t.GetConstructors() ;
Console.WriteLine("Доступные конструкторы: "); foreach(Constructorlnfo с in ci) {
// Вывести возвращаемый тип и имя.
Console.Write(" " + t.Name + "(");
// Вывести параметры.
Parameterlnfo[] pi = с.GetParameters(); for(int i=0; i < pi.Length; i++) {
Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);
■ if(i+1 < pi.Length) Console.Write(", ");
}
Console.WriteLine (")");
}
Console.WriteLine ();
// Найти подходящий конструктор, int x;
for(x=0; x < ci.Length; x++) {
Parameterlnfo[] pi = ci[x].GetParameters() ; if (pi.Length == 2) break;
}
if(x == ci.Length) {
Console.WriteLine("Подходящий конструктор не найден."); return;
}
Else
Console.WriteLine("Найден конструктор с двумя параметрами.\n");
// Сконструировать объект, object[] consargs = new object[2]; consargs[0] = 10; consargs[1] = 20;
object reflectOb = ci[x].Invoke(consargs) ;
Console.WriteLine("\пВызов методов для объекта reflectOb."); Console.WriteLine();
MethodInfo[] mi = t.GetMethods();
// Вызвать каждый метод, foreach(Methodlnfo m in mi) {
//• Получить параметры.
Parameterlnfo[] pi = m.GetParameters();
if(m.Name.CompareTo("Set")==0 &&
pi[0].ParameterType == typeof(int)) {
// Это метод Set(int, int). object[] args = new object[2]; args[0] = 9; args[l] = 18;