- •Java и c# технологии прикладного програмирования
- •Java и c# технологии прикладного програмирования
- •Содержание
- •Введение
- •Лабораторная работа № 1 Коллекции c#
- •Цель работы
- •Теоретические сведения
- •Общие сведения о платформе .Net
- •Общие сведения о коллекциях c#
- •Обобщенные коллекции с#
- •Порядок выполнения лабораторной работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Получение информации о типе
- •Экземпляр типа Type
- •Получение экземпляра типа Type
- •Динамическая загрузка сборок
- •Динамическая загрузка типов
- •Исследование типа
- •Характеристики типа как целого
- •Члены класса
- •Динамическое создание объекта и вызов методов
- •Создание объекта по его типу
- •Динамический вызов методов
- •Использование интерфейсов
- •Позднее связывание
- •Динамическое приведение типов
- •Новые механизмы абстракции
- •Динамическое создание типов
- •Динамическое создание программного кода
- •Динамическое создание класса
- •Динамическое создание перечислений
- •Динамический "Hello World!"
- •Динамическое разворачивание циклов
- •Атрибуты
- •Атрибут это класс
- •Декларативное программирование
- •Код, выполняемый во время разработки
- •Использование атрибутов
- •Использование встроенных атрибутов
- •Определение и использование пользовательских атрибутов
- •Пример декларативного программирования
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Связный уровень взаимодействия ado.Net
- •Несвязный уровень взаимодействия ado.Net
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Связи между объектами в FluentNHibernate
- •Связь один к одному
- •Связь один ко многим
- •Связь многие ко многим
- •Способы выборки объектов в FluentNHibernate
- •Запросы NativeSql
- •Запросы по критерию
- •Запросы по образцу
- •Запросы hql
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Компиляция страниц по требованию
- •Страница asp.Net 2.0
- •Директива @Page
- •Жизненный цикл страницы
- •Новые свойства и методы объекта Page
- •Управление страницей
- •Установка выделения на элемент управления
- •Обновление данных без перезагрузки страницы
- •Отправка данных формы другой странице asp.Net
- •Шаблоны дизайна страниц
- •Создание шаблона дизайна
- •Создание страницы
- •Обработка шаблонов средой asp.Net
- •Использование разных шаблонов для разных браузеров
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Библиотеки модульного тестирования в .Net
- •Unit Testing Framework от Microsoft
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Контрольные вопросы
- •Рекомендованная литература
Динамическая загрузка типов
Теперь, когда сборка загружена, можно извлечь из неё информацию о типе. Для этого необходимо использовать так называемое "квалифицированное имя типа" (AssemblyQualifiedTypeName). Квалифицированное имя типа состоит из двух частей: полного имени типа и полного или частичного имени сборки. Для получения описания метаданных некоторого типа его квалифицированное имя передаётся в статический методGetTypeклассаType. В случае успеха этот метод возвращает экземпляр классаType.
Assembly a = Assembly.LoadWithPartialName("System.Drawing");
string strAssemblyQualifiedTypeName = "System.Drawing.Rectangle, " +
a.FullName;
Type type = Type.GetType(strAssemblyQualifiedTypeName);
В данном случае загрузка типа проведена в три этапа. Сначала загружена сборка, затем получено её полное имя и, только потом, получен объект Type. Эти этапы можно объединить. Если вы знаете полное имя сборки, можно использовать его для составления квалифицированного имени типа, которое можно напрямую передать методуType.GetType().
Type type = Type.GetType("System.Drawing.Rectangle"
+ ", System.Drawing"
+ ", Version=1.0.3300.0"
+ ", Culture=neutral"
+ ", PublicKeyToken=b03f5f7f11d50a3a"
);
Исследование типа
Имея в руках объект Type, можно начинать исследовать структуру типа, который он описывает (перебирать поля, методы, события, свойства, вложенные типы).
Характеристики типа как целого
Класс Typeсодержит больше трёх десятков методов, позволяющих получать информацию об описываемом типе. Так можно узнать какое-либо свойство типа или наличие (и значение) определённого атрибута, выяснить принадлежность типа к некоторому семейству.
Методы, позволяющие получать информацию о типе, приведены в таблице 2.1.
Вот, например, как можно с помощью этих свойств получить описание семейства типа:
string GetTypeDescription(Type type)
{ return type.IsClass ? "class"
: type.IsInterface ? "interface"
: type.IsArray ? "array"
: type.IsEnum ? "enum"
: type.IsValueType ? "struct"
: "";
}
Таблица 2.1 - Методы, позволяющие получать информацию о типе
IsAbstract |
Является ли тип абстрактным классом или интерфейсом |
IsClass |
Класс ли это? (т.е. не valueTypeи не интерфейс) |
IsSealed |
Может ли тип иметь наследников? |
IsInterface |
Это интерфейс? (Заметьте, интерфейс - это не класс!) |
IsCOMObject |
А уж не COM-объект ли скрывается под видом класса .NET? |
IsValueType |
Это valuetype(тип-значение)? |
IsEnum |
Это перечисление? |
IsPrimitive |
Не является ли тип примитивным (т.е. одним из bool, byte, sbyte, short, ushort, int, uint, long, ulong, char, double, float)? |
IsArray |
Является ли тип массивом. Тип элементов массива можно получить с помощью свойства ElementType. |
IsPointer |
Является ли тип ссылкой? Тип указываемого объекта можно получить с помощью свойства ElementType. |
IsByRef |
А уж не тип ли это параметра, передаваемого по ссылке? Если да, то тип передаваемого объекта можно получить с помощью свойства ElementType. |
HasElementType |
HasElementType = IsArray || IsPointer || IsByRef. Т.е. тип является не самостоятельным типом, а лишь "производным от" ElementType. |