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

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

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






Отражение

Отражением называется процесс нахождения типов во время выполнения. Классы в пространстве имен 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; просмотров: 451. Нарушение авторских прав; Мы поможем в написании вашей работы!



Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

ОСНОВНЫЕ ТИПЫ МОЗГА ПОЗВОНОЧНЫХ Ихтиопсидный тип мозга характерен для низших позвоночных - рыб и амфибий...

Принципы, критерии и методы оценки и аттестации персонала   Аттестация персонала является одной их важнейших функций управления персоналом...

Пункты решения командира взвода на организацию боя. уяснение полученной задачи; оценка обстановки; принятие решения; проведение рекогносцировки; отдача боевого приказа; организация взаимодействия...

Толкование Конституции Российской Федерации: виды, способы, юридическое значение Толкование права – это специальный вид юридической деятельности по раскрытию смыслового содержания правовых норм, необходимый в процессе как законотворчества, так и реализации права...

Значення творчості Г.Сковороди для розвитку української культури Важливий внесок в історію всієї духовної культури українського народу та її барокової літературно-філософської традиції зробив, зокрема, Григорій Савич Сковорода (1722—1794 pp...

Постинъекционные осложнения, оказать необходимую помощь пациенту I.ОСЛОЖНЕНИЕ: Инфильтрат (уплотнение). II.ПРИЗНАКИ ОСЛОЖНЕНИЯ: Уплотнение...

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