Кафедра "ПОВТ и АС"    

 
   Главная|   Введение|   Раздел 1|   Раздел 2|   Литература|   Скачать архив (19кб)


1. Назначение рефлексии и ее использование в задачах позднего связывания

   В среде .NET рефлексия – это процесс нахождения (обнаружения) и исследования внутренней структуры сборок, структур и классов непосредственно в процессе работы программы. То есть другими словами непосредственно в программе мы можем получить, например, список всех типов, объявленных в модуле, список всех методов, интерфейсов, полей и свойств этих типов, а также списки атрибутов, примененных к различным элементам. Вся эта информация носит название метаданных – данных о данных. Основные возможности, предоставляемые механизмом рефлексии, сосредоточены в классах System.Type, System.Activator и System.Assembly и нескольких вспомогательных типах расположенных в пространстве имен System.Reflection.

Имя класса Назначение и описание
MethodInfo Предоставляет информацию о методе класса или структуры данных. О количестве параметров, их типах, типе возвращаемого значения и т.д.
ParameterInfo Описывает параметр, передаваемый в метод класса (его тип, имя, порядковый номер в списке параметров).
PropertyInfo Описывает характеристики свойства класса (тип, имя, возможность чтения/записи и т.д.).


   Пример программы, в которой используются средства рефлексии для получения методов, описанных в классе MyClass. Для каждого метода выводится его имя и тип:

using System;
using System.Reflection;
class MyClass {
int x;
int y;
public MyClass(int i, int j) { this.x = i; this.y = j; }
public int sum() { return x+y; }
public void set(double a, double b) { x = (int) a; y = (int) b; }
}
class ReflectDemo {
public static void Main() {
// Получаем Type-объект, описывающий MyClass
Type t = typeof(MyClass);
Console.WriteLine("Поддерживаемые методы: " ) ;
foreach(Methodinfо m in t.GetMethods())
// Отображаем тип результата и имя метода
Console.Write(" {0} {1}(…)", m.ReturnType.Name, m.Name) ;
} //Main
} //ReflectDemo

   Зная, какие методы поддерживает тип, можно вызвать любой из них. Для этого используется метод, определенный в классе MethodInfo как object Invoke(object ob, object[] args), где obj соответствует объекту, для которого вызывается метод (аналог параметра this), а args – набору аргументов, передаваемых в метод. Причем, если метод не имеет аргументов, параметр args должен быть представлен массивом нулевой длины (а не значением null).



   ЗАДАНИЕ 1.
  1. Описать класс MyClass, который будет содержать:
    • поля различных типов и различным уровнем доступа;
    • методы, с различным набором аргументов и различным типом возвращаемого значения.
  2. Объявить класс MyTestClass, который будет содержать методы выполняющие следующие действия:
    • выводить по имени класса имена методов, которые содержат строковые параметры (имя класса передается в качестве аргумента);
    • вызывать некоторый метод класса, при этом значения для его параметров необходимо прочитать из текстового файла (имя класса и имя метода передаются в качестве аргументов).
   ЗАДАНИЕ 2
  1. Расположить класс MyClass в отдельном .cs-файле и дополнить его следующими членами:
    • перегрузить конструктор: один конструктор без параметров, другой с параметрами;
    • объявить два интерфейса (IInterface1 и IInterface2) как минимум с двумя методами каждый и реализовать их
    • одно из полей объявить как static
  • В классе MyTestClass реализовать метод (принимающий в качестве параметра имя класса), который выводит всё содержимое класса в текстовый файл;
  • Реализовать метод (принимающий в качестве параметра имя класса), который записывает все члены класса в файл *.cs, который должен правильно компилироваться в среде .NET.


  •    Главная|   Введение|   Раздел 1|   Раздел 2|   Литература|   Скачать архив (19кб)