Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Как только будет получен объект класса 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);

&#9632; 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;





Поделиться с друзьями:


Дата добавления: 2016-12-03; Мы поможем в написании ваших работ!; просмотров: 617 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Студент всегда отчаянный романтик! Хоть может сдать на двойку романтизм. © Эдуард А. Асадов
==> читать все изречения...

2466 - | 2202 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.