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

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

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






Отражение

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



Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

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

БИОХИМИЯ ТКАНЕЙ ЗУБА В составе зуба выделяют минерализованные и неминерализованные ткани...

Типология суицида. Феномен суицида (самоубийство или попытка самоубийства) чаще всего связывается с представлением о психологическом кризисе личности...

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

ОПРЕДЕЛЕНИЕ ЦЕНТРА ТЯЖЕСТИ ПЛОСКОЙ ФИГУРЫ Сила, с которой тело притягивается к Земле, называется силой тяжести...

СПИД: морально-этические проблемы Среди тысяч заболеваний совершенно особое, даже исключительное, место занимает ВИЧ-инфекция...

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

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