- •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
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Контрольные вопросы
- •Рекомендованная литература
Динамическое создание типов
Это ещё один приём программирования в среде .NET, тесно связанный с метаданными, и сулящий не менее революционные изменения в методах программирования.
Динамическое создание программного кода
Иногда требуется динамически создать некий программный код, например класс или перечисление. Естественно, что этот код будет храниться в некоторой сборке. При этом сама динамически созданная сборка может существовать только в памяти или же может быть сохранена на диске в виде файла.
Порядок создания соответствующих объектов программного кода следующий:
Сгенерировать сборку;
На основе этой сборки сгенерировать модуль;
На основе этого модуля сгенерировать тип (например, класс);
На основе этого типа (класса) сгенерировать его члены (конструкторы, методы и т.п.);
Выполнить непосредственное создание типа.
Ниже приведены два примера создания динамического кода – класса и перечисления.
Динамическое создание класса
Пример создания класса по описанной выше методике.
using System;
using System.Reflection;
using System.Reflection.Emit;
// Создание имени сборки
AssemblyName an = new AssemblyName("MyAssembly");
an.Version = new Version("1.0.0.0");
// Создание сборки
ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save);
// Создание модуля в сборке
ModuleBuilder mb = ab.DefineDynamicModule("MyModule", "My.dll");
// Создание типа в сборке
TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public);
// Создание конструктора без параметров.
ConstructorBuilder cb0 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
// Добавление кода для конструктора
ILGenerator il0 = cb0.GetILGenerator();
il0.Emit(OpCodes.Ret);
// Создание конструктора с параметром типа string
ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof(string)});
// Добавление кода для конструктора
ILGenerator il = cb.GetILGenerator();
il.EmitWriteLine("Constructor");
il.Emit(OpCodes.Ret);
// Непосредственное создание типа
tb.CreateType();
// Сохранение типа в файл
ab.Save("My1.dll");
Приведенный код при запуске создаст на диске файл My1.dll, в котором будет класс с 2-мя конструкторами, причем второй конструктор будет при вызове выводить строчку "Constructor".
Два пояснения по коду:
Очень часто при создании типов и членов этих типов надо указать их атрибуты (модификаторы доступа типа publicи т. п.). Это мы делаем через перечисленияTypeAttributesиMethodAttributes, которое содержит соответствующие значения (Public, например). Несколько необходимых значений из этих перечислений можно соединить через побитовое "или".
Метод EmitклассаILGeneratorв качестве параметра принимает перечислениеOpCodes, которое фактически содержит инструкции на языкеIL- языке, который является аналогом для .NET обычного ассемблера. Это означает, что его инструкции не столь очевидны для реального программирования - именно поэтому в качестве примера такихIL-инструкций и была приведена самая простая из них - а именно выход из функции (OpCodes.Ret).