Студопедия — Необходимые теоретические сведения. Отражением называется процесс нахождения типов во время выполнения
Студопедия Главная Случайная страница Обратная связь

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

Необходимые теоретические сведения. Отражением называется процесс нахождения типов во время выполнения






Отражение

Отражением называется процесс нахождения типов во время выполнения. Классы в пространстве имен System.Reflection вместе с System.Type позволяют получать сведения о загруженных сборках и определенных в них типах, таких как классы, интерфейсы и типы значений. Отражение можно также использовать для создания экземпляров типов во время выполнения, для вызова этих экземпляров и получения доступа к ним.

Класс System.Type

Данный класс определяет несколько членов, которые можно задействовать для исследования метаданных типов. Многие из этих членов возвращают типы из пространства имен System.Reflection. Приведем некоторые из них.

Член Описание
IsAbstract IsArray IsClass IsEnum IsValueType Эти свойства позволяют получать различную основную информацию о типе: является ли он массивом, абстрактным, значимым и т.д.
GetConstructors() GetEvents() GetFields() GetInterfaces() GetMethods() GetProperties() GetNestedTypes() Эти методы позволяют получить массив, содержащий требуемые элементы(интерфейсы, методы, свойства и т.д.). Каждый метод возвращает соответствующий массив (например, GetFields() возвращает массив FieldInfo, GetMethods() возвращает массив MethodInfo). Каждый из этих методов имеет форму в единственном числе, например GetMethod().
GetType() Статический метод возвращает экземпляр класса Type на основании переданного имени
InvokeMember() Метод позволяет выполнять позднее связывание для заданного элемента

Получить экземпляр класса Type можно разными способами, но непосредственно создать объект этого типа нельзя, так как Type – это абстрактный класс.

// получение информации о типе, используя экземпляр этого типа

Manager Bill = new Manager();

Type t = Bill.GetType();

// получение информации о типе статическим методом GetType()

// параметры – имя типа в сборке, имя сборки

Type t = Type.GetType(“Employers.Manager, Employers ”);

// получение информации о типе с помощью оператора typeof()

Type t = typeof(Manager);

Для иллюстрации механизма отражения приведем пример приложения, которое будет выводить информацию о методах, свойствах, полях для любого типа в библиотеке mscorlib.dll. Данный пример взят из книги [].

// Статический метод, который выводит информацию о различных
// свойствах исследуемого типа

public static void ListVariousStats(Type t)

{

Console.WriteLine("***** Various Statistics *****");

Console.WriteLine("Base class is: {0}", t.BaseType);

Console.WriteLine("Is type abstract? {0}", t.IsAbstract);

Console.WriteLine("Is type sealed? {0}", t.IsSealed);

Console.WriteLine("Is type generic? {0}", t.IsGenericTypeDefinition);

Console.WriteLine("Is type a class type? {0}", t.IsClass);

Console.WriteLine("");

}

// Статический метод, который выводит список всех методов исследуемого
// типа, их параметры и тип возвращаемого значения

public static void ListMethods(Type t)

{

Console.WriteLine("***** Methods *****");

MethodInfo[] mi = t.GetMethods();

foreach (MethodInfo m in mi)

{

// Get return value.

string retVal = m.ReturnType.FullName;

string paramInfo = "(";

// Get params.

foreach (ParameterInfo pi in m.GetParameters())

{

paramInfo += string.Format("{0} {1} ", pi.ParameterType, pi.Name);

}

paramInfo += ")";

// Now display the basic method sig.

Console.WriteLine("->{0} {1} {2}", retVal, m.Name, paramInfo);

}

Console.WriteLine("");

}

// Статический метод, который выводит список полей исследуемого типа

public static void ListFields(Type t)

{

Console.WriteLine("***** Fields *****");

FieldInfo[] fi = t.GetFields();

foreach (FieldInfo field in fi)

Console.WriteLine("->{0}", field.Name);

Console.WriteLine("");

}

// Статический метод, который выводит список свойств исследуемого типа

public static void ListProps(Type t)

{

Console.WriteLine("***** Properties *****");

PropertyInfo[] pi = t.GetProperties();

foreach (PropertyInfo prop in pi)

Console.WriteLine("->{0}", prop.Name);

Console.WriteLine("");

}

// Статический метод, который выводит список реализованных в типе
// интерфейсов

public static void ListInterfaces(Type t)

{

Console.WriteLine("***** Interfaces *****");

Type[] ifaces = t.GetInterfaces();

foreach (Type i in ifaces)

Console.WriteLine("->{0}", i.Name);

}

// Приложение

static void Main(string[] args)

{

Console.WriteLine("***** Welcome to MyTypeViewer *****");

string typeName = "";

bool userIsDone = false;

do

{

Console.WriteLine("\nEnter a type name to evaluate");

Console.Write("or enter Q to quit: ");

// Получение имени типа для исследования

typeName = Console.ReadLine();

// Проверка окончания работы с программой

if (typeName.ToUpper() == "Q")

{

userIsDone = true;

break;

}

// Try to get named type.

try

{

Type t = Type.GetType(typeName);

Console.WriteLine("");

ListVariousStats(t);

ListFields(t);

ListProps(t);

ListMethods(t);

ListInterfaces(t);

}

catch

{

Console.WriteLine("Sorry, can't find type");

}

} while (!userIsDone);

}

Динамическая загрузка сборок

Динамическая загрузка сборок – это процесс загрузки внешних сборок по запросу. Пространство имен System.Reflection определяет класс Assembly, используя который можно динамически загружать как общие, так и частные сборки и получать их свойства. Приведем фрагмент кода, который по введенному имени сборки выводит о ней информацию.

// Получим имя сборки

string asmName = Console.ReadLine();

// Динамическая загрузка

try

{

asm = Assembly.Load(asmName);

Console.WriteLine("\n** Types in Assembly **");

Console.WriteLine("->{0}", asm.FullName);

Type[] types = asm.GetTypes();

foreach (Type t in types)

Console.WriteLine("Type: {0}", t);

}

catch

{

Console.WriteLine("Sorry, can't find assembly.");

}

...

Позднее связывание

Позднее связывание – это техника, позволяющая создать экземпляр некоторого типа и вызывать его члены во время выполнения, не имея информации о нем во время компиляции. Прежде всего эта техника используется для создания расширяемых приложений(plug-in), то есть приложений, которые позволяют сторонним производителям встроить в них свои модули. Примером расширяемого приложения является среда разработки MS Visual Studio.

Понятно, что расширяемое приложение должно предоставить некоторый механизм, позволяющий указать, какой модуль встроить, а это динамическая загрузка. Расширяемое приложение должно определить поддерживает ли модуль нужную функциональность, здесь требуется отражение. И наконец, расширяемое приложение должно получить ссылку на необходимый класс или интерфейс и вызвать его члены. Для этих действий и необходимо позднее связывание.

Приведем пример расширяемого приложения. Сначала определим общий интерфейс, который будет реализован каждым встраиваемым модулем.

public interface IAppFunctionality

{

void DoIt();

}

Код встраиваемого модуля может быть таким:

public class TheCSharpModule: IAppFunctionality

{

void IAppFunctionality.DoIt()

{

MessageBox.Show("You have just used the C# snap in!");

}

}

Теперь приведем код формы расширяемого приложения Windows Forms.

partial class Form1: Form

{

public Form1()

{

InitializeComponent();

}

private bool LoadExternalModule(string path)

{

bool foundSnapIn = false;

IAppFunctionality itfAppFx;

// Динамическая загрузка выбранного модуля.

Assembly theSnapInAsm = Assembly.LoadFrom(path);

// Получение всех типов сборки

Type[] theTypes = theSnapInAsm.GetTypes();

// Поиск типа, реализующего интерфейс IAppFunctionality.

for (int i = 0; i < theTypes.Length; i++)

{

Type t = theTypes[i].GetInterface("IAppFunctionality");

if (t!= null)

{

foundSnapIn = true;

// Позднее связывание для создания экземпляра типа

object o = theSnapInAsm.CreateInstance(theTypes[i].FullName);

 

// Вызов метода DoIt() интерфейса

itfAppFx = o as IAppFunctionality;

itfAppFx.DoIt();

lstLoadedSnapIns.Items.Add(theTypes[i].FullName);

}

}

return foundSnapIn;

}

// Обработчик события выбора пункта меню «загрузка модуля»

private void snapInModuleToolStripMenuItem_Click_1(object sender, EventArgs e)

{

// Открытие диалога для выбора модуля для загрузки

OpenFileDialog dlg = new OpenFileDialog();

if (dlg.ShowDialog() == DialogResult.OK)

{

if (LoadExternalModule(dlg.FileName) == false)

MessageBox.Show("Nothing implements IAppFunctionality!");

}

}

}

Контрольные вопросы

1) Что такое отражение?

2) Как можно получить экземпляр класса System.Type?

3) Когда применяется динамическая загрузка сборок?

4) Приведите фрагмент кода, иллюстрирующий механизм отражения.

5) Для какой цели используется позднее связывание?

6) Как создать расширяемое приложение?







Дата добавления: 2015-09-06; просмотров: 450. Нарушение авторских прав; Мы поможем в написании вашей работы!



Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Методы прогнозирования национальной экономики, их особенности, классификация В настоящее время по оценке специалистов насчитывается свыше 150 различных методов прогнозирования, но на практике, в качестве основных используется около 20 методов...

Методы анализа финансово-хозяйственной деятельности предприятия   Содержанием анализа финансово-хозяйственной деятельности предприятия является глубокое и всестороннее изучение экономической информации о функционировании анализируемого субъекта хозяйствования с целью принятия оптимальных управленческих...

Образование соседних чисел Фрагмент: Программная задача: показать образование числа 4 и числа 3 друг из друга...

Правила наложения мягкой бинтовой повязки 1. Во время наложения повязки больному (раненому) следует придать удобное положение: он должен удобно сидеть или лежать...

ТЕХНИКА ПОСЕВА, МЕТОДЫ ВЫДЕЛЕНИЯ ЧИСТЫХ КУЛЬТУР И КУЛЬТУРАЛЬНЫЕ СВОЙСТВА МИКРООРГАНИЗМОВ. ОПРЕДЕЛЕНИЕ КОЛИЧЕСТВА БАКТЕРИЙ Цель занятия. Освоить технику посева микроорганизмов на плотные и жидкие питательные среды и методы выделения чис­тых бактериальных культур. Ознакомить студентов с основными культуральными характеристиками микроорганизмов и методами определения...

САНИТАРНО-МИКРОБИОЛОГИЧЕСКОЕ ИССЛЕДОВАНИЕ ВОДЫ, ВОЗДУХА И ПОЧВЫ Цель занятия.Ознакомить студентов с основными методами и показателями...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия