- •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
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Контрольные вопросы
- •Рекомендованная литература
Члены класса
Для получения информации о членах класса имеется несколько групп (семейств) методов. Каждая группа обеспечивает получение информации об определённом типе членов класса. Например, информацию только о конструкторах класса, или только о его полях. Но есть одна группа методов, которые позволяют получать информацию сразу обо всех членах класса. Это семейство методов GetMembers.
public MemberInfo[] GetMembers();
public abstract MemberInfo[] GetMembers(BindingFlags);
В каждом семействе имеется не меньше двух методов, аналогичных приведенным выше. Один из этих методов возвращает массив, содержащий информацию об открытых (public)членах, а другой позволяет указать, информацию о каких членах класса следует возвращать. Например, если передать в качестве параметраBindingFlags.Public | BindingFlags.Instance, будут возвращены все открытые нестатические члены класса. Если вам нужна информация ещё и о статических членах, нужно добавить ещё один флагBindingFlags.Static. А если вас интересуют не только открытые, но и закрытые члены, следует использовать флагBindingFlags.NonPublic.
Ниже перечислены основные семейства методов класса Type, используемые для получения информации о членах класса.
Таблица 2.2 – Основные методы класса Type
GetConstructors |
Получение информации о конструкторах класса. Возвращает массив элементов типа ConstructorInfo. |
GetCustomAttributes |
Получение информации об атрибутах класса. Возвращает массив объектов-атрибутов. |
GetEvents |
Получение информации о событиях, поддерживаемых классом. Возвращает массив элементов типа EventInfo. |
GetFields |
Получение информации о полях класса. Возвращает массив элементов типа FieldInfo. |
GetInterfaces |
Получение информации об интерфейсах, реализованных или унаследованных классом. Возвращает массив элементов типа Type. |
GetMembers |
Получение информации о членах класса (включая свойства, методы, поля, события и т.д.) Возвращает массив элементов типа MemberInfo. |
GetMethods |
Получение информации о методах класса. Возвращает массив элементов типа MethodInfo. |
GetNestedTypes |
Получение информации о вложенных типах класса. Возвращает массив элементов типа Type. |
GetProperties |
Получение информации о свойствах (properties) класса. Возвращает массив элементов типаPropertyInfo. |
GetTypeArray |
Получение информации о типе элементов массива (если рассматриваемый тип является массивом). Возвращает соответствующий объект Type. |
Поскольку и конструкторы, и поля, и события, и методы, и свойства - это всё члены класса, то совершенно логично, что соответствующие им типы метаданных, (ConstructorInfo, EventInfo, FieldInfo, MethodInfo, PropertyInfo) унаследованы от типаMemberInfo.
Давайте рассмотрим пример получения информации обо всех конструкторах класса.
public static string TraceCtorsOf(Type type)
{ string trace = "";
ConstructorInfo[] arrCI = type.GetConstructors();
foreach (ConstructorInfo ci in arrCI)
{ trace += (ci.IsStatic ? "static " : "")
+ (ci.IsPrivate ? "private " : "")
+ (ci.IsFamily ? "protected " : "")
+ (ci.IsAssembly ? "internal " : "")
+ ci.Name;
ParameterInfo[] arrParamInfo = ci.GetParameters();
trace += "(";
for (int i = 0; i != arrParamInfo.Length; i++)
{ ParameterInfo parInf = arrParamInfo[i];
trace += (i != 0 ? ", " : "")
+ (parInf.IsIn ? "in " : "")
+ (parInf.IsOut ? "out " : "")
+ (parInf.IsOptional ? "optional ": "")
+ (parInf.IsLcid ? "lcid " : "")
+ parInf.ParameterType.Name + " "
+ parInf.Name
+ ((parInf.DefaultValue != DBNull.Value)
? (" = " + parInf.DefaultValue) : "")
;
}
trace += ");\r\n";
}
return trace;
}
В этом примере можно видеть, каким способом извлекается информация о параметрах методов. Каждая структура данных, отвечающая за методы-члены (EventInfo, MethodInfo, ConstructorInfo), имеет методGetParameters(), возвращающий массив элементов типа ParameterInfo. Каждый элемент этого массива описывает отдельный параметр метода: его тип, имя, значение по умолчанию, направление передачи данных(in/out)и др.