- •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
- •Порядок выполнения работы
- •Задание на лабораторную работу
- •Содержание отчета
- •Контрольные вопросы
- •Рекомендованная литература
Пример декларативного программирования
Рассмотрим этот механизм на примере работы процедуры протоколирования, приведенной в подразделе "Трассировка полей объекта". В своем простейшем виде она выводит абсолютно все поля объекта без разбора. С помощью атрибутов можно создать механизм управления выводом в logтех или иных полей класса (фильтрация). Для этого достаточно ввести новый атрибут, обозначающий, что протоколирование данного поля не требуется. Ниже приведено описание атрибута NotTrace:
[AttributeUsage(AttributeTargets.Field) ]
public class NotTrace : Attribute
{
}
Чтобы упростить использование этого атрибута, напишем простую вспомогательную функцию:
static bool NeedTrace(FieldInfo fi)
{ return ! Attribute.IsDefined(fi, typeof(NotTrace));
}
Теперь можно модифицировать функцию протоколирования, чтобы она выводила только те поля, у которых не задан атрибут NotTrace:
foreach (FieldInfo fi in type.GetFields(...))
{ if (! NeedTrace(fi))
continue;
...
}
Теперь управление выводом полей производится не изменением кода функции протоколирования, а изменением описаний полей – заданием их атрибутов. Другими словами, судьба объекта задаётся при его декларации–декларативное программирование.
Порядок выполнения работы
В данном порядке выполнения работы рассмотрено создание приложения для просмотра содержимого сборки. Приложение будет выводить на экран интерфейсы и классы сборки, конструкторы, методы и поля классов, передаваемые и возвращаемые параметры методов.
Создайте новое приложение WindowsForms. Как создавать приложение, описано в порядке выполнения работы лабораторной работы № 1.
Спроектируйте интерфейс пользователя: разместите на форме лавное меню (компонент MenuStrip),добавьте пункт меню «Файл», к пункту меню файл добавьте пункт меню «Открыть сборку».
Разместите на форме компонент TreeViewи разверните его по размерам формы, добавьте компонентImageList, свяжите компонентImageListсTreeView(свойствоImageList), добавьте в него несколько картинок для узлов дерева, добавьте компонентOpenFileDialog.
Откройте форму в режиме редактора CSharp, добавьте методы для открытия произвольной сборки с использованиемOpenFileDialog:
//Получение пути к сборке через OpenFileDialog
private string selectAssemblyFile()
{
openFileDialog1.Filter = "Dll files (*.dll)|*.dll|Exe files
(*.exe)|*.exe| All files (*.*)|*.*";
openFileDialog1.Title = "Select assembly file";
return (openFileDialog1.ShowDialog() == DialogResult.OK) ?
openFileDialog1.FileName : null;
}
//Загрузка сборки
private Assembly openAssembly(string path)
{
try
{
Assembly a = Assembly.LoadFrom(path);
return a;
}
catch (Exception)
{
MessageBox.Show("Не удалось загрузить указанную сборку!",
"Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
Добавьте ссылку на сборку над конструктором формы:
private Assembly assembly;
Добавьте методы по добавлению в дерево всех классов и интерфейсов, а также полей, конструкторов и методов класса:
//Добавить все классы и интерфейсы сборки к узлу дерева
void addRoot(TreeNode root, Type[] types)
{
TreeNode node = null;
foreach (Type type in types)
{
node = new TreeNode();
node.Text = type.ToString();
//Если класс
if (type.IsClass)
{
node.ImageIndex = 1;
node.SelectedImageIndex = 1;
addFirstLevel(node, type);
root.Nodes.Add(node);
}
//Если интерфейс
else if (type.IsInterface)
{
node.ImageIndex = 2;
node.SelectedImageIndex = 2;
addFirstLevel(node, type);
root.Nodes.Add(node);
}
}
}
//Загрузить все поля, конструкторы и методы
private void addFirstLevel(TreeNode node, Type type)
{
TreeNode node1 = null;
FieldInfo[] fields = type.GetFields();
MethodInfo[] methods = type.GetMethods();
ConstructorInfo[] constructors = type.GetConstructors();
//Загрузить поля
foreach (FieldInfo field in fields)
{
node1 = new TreeNode();
node1.Text = field.FieldType.Name + " " + field.Name;
node1.ImageIndex = 5;
node1.SelectedImageIndex = 5;
node.Nodes.Add(node1);
}
//Загрузить конструкторы
foreach (ConstructorInfo constructor in constructors)
{
String s = "";
ParameterInfo[] parametrs = constructor.GetParameters();
foreach (ParameterInfo parametr in parametrs)
{
s = s + parametr.ParameterType.Name + ", ";
}
s = s.Trim();
s = s.TrimEnd(',');
node1 = new TreeNode();
node1.Text = node.Text + "(" + s + ")";
node1.ImageIndex = 6;
node1.SelectedImageIndex = 6;
node.Nodes.Add(node1);
}
//Загрузить методы
foreach (MethodInfo method in methods)
{
String s = "";
ParameterInfo[] parametrs = method.GetParameters();
foreach (ParameterInfo parametr in parametrs)
{
s = s + parametr.ParameterType.Name + ", ";
}
s = s.Trim();
s = s.TrimEnd(',');
node1 = new TreeNode();
node1.Text = method.ReturnType.Name + " " + method.Name + "("
+ s + ")";
node1.ImageIndex = 4;
node1.SelectedImageIndex = 4;
node.Nodes.Add(node1);
}
}
Добавьте обработчик нажатия на пункт меню «Открыть сборку»:
private void открытьСборкуToolStripMenuItem_Click(object sender,
EventArgs e)
{
treeView1.Nodes.Clear();
string path = selectAssemblyFile();
if (path != null)
{
assembly = openAssembly(path);
}
if (assembly != null)
{
TreeNode root = new TreeNode();
root.Text = assembly.GetName().Name;
root.ImageIndex = 0;
root.SelectedImageIndex = 0;
treeView1.Nodes.Add(root);
Type[] types = assembly.GetTypes();
addRoot(root, types);
}
}
Запустите проект и попробуйте открыть сборку. Можно, например, открыть сборку cкаталогаWINDOWS\Microsoft.NET\Framework.
Внешний вид программы представлен на рисунке 2.1.
Рисунок 2.1 – Внешний вид интерфейса программы