- •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
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Контрольные вопросы
- •Рекомендованная литература
Динамический вызов методов
Вызов конструкторов с параметрами, рассмотренный выше, является частным случаем динамического вызова методов. Вызов остальных методов производится без помощи дополнительных классов типа Activator. Этим занимается сам классType.
Динамический вызов метода динамически созданного объекта:
static void Main()
{ // Получаем объект-тип для System.Drawing.Rectangle
Assembly a = Assembly.LoadWithPartialName("System.Drawing");
AssemblyName an = a.GetName();
Type typeRect = Type.GetType("System.Drawing.Rectangle,"
+ an.FullName, true);
// Готовим параметры для вызова конструктора
// Rectangle(Int32 x, Int32 y, Int32 width, Int32 height);
object[] ctorArgs = { 10, 10, 100, 100 };
Object rect = Activator.CreateInstance(typeRect, ctorArgs, null);
// Выводим поля динамически созданного объекта
Console.WriteLine(Trace1.ObjectFields("rect", rect));
// Готовим параметры вызова метода Boolean Contains(Point pt);
System.Drawing.Point point = new System.Drawing.Point(50, 50);
object[] argContains = { point };
object contain = typeRect.InvokeMember("Contains"
, BindingFlags.Public
| BindingFlags.InvokeMethod
| BindingFlags.Instance
, null
, rect
, argContains
);
Console.WriteLine( contain.Equals(true) ?
"contains" : "does not contain");
Console.WriteLine(Trace1.ObjectFields("point", point));
Console.ReadLine();
}
Если вызываемый метод перегружен, будет вызван тот вариант метода, который имеет те же типы параметров, причем в том же порядке, что и типы элементов переданного массива параметров.
Использование интерфейсов
Для вызова методов динамически созданного объекта можно применять гораздо более удобный и эффективный способ. Правда, этот способ работает, только если разработчик знаете, что объект реализует известный ему на момент компиляции интерфейс.
Использование динамически созданного объекта через интерфейс:
static void Main()
{ // Получаем объект-тип для System.Drawing.SolidBrush
Assembly a = Assembly.LoadWithPartialName("System.Drawing");
AssemblyName an = a.GetName();
Type typeBrush = Type.GetType("System.Drawing.SolidBrush,"
+ an.FullName, true);
// Готовим параметры для вызова конструктора
// SolidBrush(Color color);
object[] ctorArgs2 = { System.Drawing.Color.Blue };
Object brush = Activator.CreateInstance(typeBrush
, ctorArgs2, null);
// Выводим поля динамически созданного объекта
Console.WriteLine(Trace1.ObjectFields("brush", brush));
// Получаем ссылку на интерфейс
ICloneable cloner = brush as ICloneable;
if (cloner != null)
{ Object brushCloned = cloner.Clone();
Console.WriteLine(Trace1.ObjectFields("brushCloned"
, brushCloned));
}
Console.ReadLine();
}
Очевидно, что эффективность вызова метода динамически созданного объекта через интерфейс гораздо выше, чем через InvokeMember, ведь это обычный вызов виртуального метода. Поэтому, если есть такая возможность, лучше использовать интерфейсы.
Для получения ссылки на интерфейс ICloneableздесь применяется операцияasязыка C#. Эта операция возвращает ссылку на интерфейс, если он реализован объектом. Если объект не поддерживает данный интерфейс, будет возвращенапустая ссылка(null). Ниже будут подробнее рассмотрены другие способы динамического приведения типов.