Класс System.Type - ядро подсистемы рефлексии



 

Класс System.Туре составляет ядро подсистемы рефлексии, поскольку он инкапсулирует тип данных. Он содержит многие свойства и методы, которыми можно пользоваться для получения информации о типе данных во время выполнения. Класс Туре является производным от абстрактного класса System.Reflection.MemberInfо.

В классе MemberInfо определены приведенные ниже свойства, доступные только для чтения.

 

Свойство - Описание

 

Type DeclaringType - Тип класса или интерфейса, в котором объявляется отражаемый член

MemberTypes MemberType - Тип члена. Это значение обозначает, является ли член полем, методом, свойством, событием или конструктором

int MetadataToken - Значение, связанное к конкретными метаданными

Module Module - Объект типа Module, представляющий модуль (исполняемый файл), в котором находится отражаемый тип

string Name - Имя типа

Type ReflectedType - Тип отражаемого объекта

 

Следует иметь в виду, что свойство MemberType возвращает тип MemberTypes — перечисление, в котором определяются значения, обозначающие различные типы членов. К их числу относятся следующие.

 

MemberTypes.Constructor

MemberTypes.Method

MemberTypes.Field

MemberTypes.Event

MemberTypes.Property

 

Следовательно, тип члена можно определить, проверив свойство MemberType. Так, если свойство MemberType имеет значение MemberTypes.Method, то проверяемый член является методом.

В класс Memberlnfо входят два абстрактных метода: GetCustomAttributes() и IsDefined(). Оба метода связаны с атрибутами. Первый из них получает список специальных атрибутов, имеющих отношение к вызывающему объекту, а второй устанавливает, определен ли атрибут для вызывающего метода. В версию .NET Framework Version 4.0 внедрен метод GetCustomAttributesData(), возвращающий сведения о специальных атрибутах. (Подробнее об атрибутах речь пойдет далее в этой главе.)

Класс Туре добавляет немало своих собственных методов и свойств к числу тех, что определены в классе Memberlnfо. В качестве примера ниже перечислен ряд наиболее часто используемых методов класса Туре.

 

Метод - Назначение

 

Constructorlnfо[] GetConstructors() - Получает список конструкторов для заданного типа

EventInfo[] GetEvents() - Получает список событий для заданного типа

Fieldlnfо[] GetFields() - Получает список полей для заданного типа

Type[] GetGenericArguments() - Получает список аргументов типа, связанных с закрыто сконструированным обобщенным типом, или же список параметров типа, если заданный тип определен как обобщенный. Для открыто сконструированного типа этот список может содержать как аргументы, так и параметры типа. (Более подробно обобщения рассматриваются в главе 18.)

MemberInfo[] GetMembers() - Получает список членов для заданного типа

MethodInfo[] GetMethods() - Получает список методов для заданного типа

PropertyInfo[] GetProperties() - Получает список свойств для заданного типа

 

Далее приведен ряд наиболее часто используемых свойств, доступных только для чтения и определенных в классе Туре.

 

Свойство - Назначение

 

Assembly Assembly - Получает сборку для заданного типа

TypeAttributes Attributes - Получает атрибуты для заданного типа

Type BaseType - Получает непосредственный базовый тип для заданного типа

string FullName - Получает полное имя заданного типа

bool IsAbstract - Истинно, если заданный тип является абстрактным

bool isArray - Истинно, если заданный тип является массивом

bool IsClass - Истинно, если заданный тип является классом

bool IsEnum - Истинно, если заданный тип является перечислением

bool IsGenericParameter - Истинно, если заданный тип является параметром обобщенного типа. (Более подробно обобщения рассматриваются в главе 18.)

bool IsGenericType - Истинно, если заданный тип является обобщенным. (Более подробно обобщения рассматриваются в главе 18.)

string Namespace - Получает пространство имен для заданного типа

 

 

Применение рефлексии

 

С помощью методов и свойств класса Туре можно получить подробные сведения о типе данных во время выполнения программы. Это довольно эффективное средство. Ведь получив сведения о типе данных, можно сразу же вызвать его конструкторы и методы или воспользоваться его свойствами. Следовательно, рефлексия позволяет использовать код, который не был доступен во время компиляции.

Прикладной интерфейс Reflection API весьма обширен и поэтому не может быть полностью рассмотрен в этой главе. Ведь для этого потребовалась бы целая книга! Но прикладной интерфейс Reflection API имеет ясную логическую структуру, а следовательно, уяснив одну его часть, нетрудно понять и все остальное. Принимая во внимание это обстоятельство, в последующих разделах демонстрируются четыре основных способа применения рефлексии: получение сведений о методах, вызов методов, конструирование объектов и загрузка типов данных из сборок.

 

 

Получение сведений о методах

 

Имея в своем распоряжении объект класса Туре, можно получить список методов, поддерживаемых отдельным типом данных, используя метод GetMethods(). Ниже приведена одна из форм, подходящих для этой цели.

 

MethodInfo[] GetMethods()

 

Этот метод возвращает массив объектов класса Methodlnfо, которые описывают методы, поддерживаемые вызывающим типом. Класс MethodInfo находится в пространстве имен System.Reflection.

Класс MethodInfo является производным от абстрактного класса MethodBase, который в свою очередь наследует от класса MemberInfо. Это дает возможность пользоваться всеми свойствами и методами, определенными в этих трех классах. Например, для получения имени метода служит свойство Name. Особый интерес вызывают два члена класса MethodInfo: ReturnType и GetParameters().

Возвращаемый тип метода находится в доступном только для чтения свойстве ReturnType, которое является объектом класса Туре.

Метод GetParameters() возвращает список параметров, связанных с анализируемым методом. Ниже приведена его общая форма.

 

Parameterlnfо[] GetParameters();

 

Сведения о параметрах содержатся в объекте класса ParameterInfо. В классе Parameterlnfо определено немало свойств и методов, описывающих параметры. Особое значение имеют два свойства: Name — представляет собой строку, содержащую имя параметра, a ParameterType — описывает тип параметра, который инкапсулирован в объекте класса Туре.

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

 

// Анализ методов с помощью рефлексии.

using System;

using System.Reflection;

 

class MyClass {

int x;

int y;

public MyClass(int i, int j) {

x = i;

y = j;

}

 

public int Sum() {

return x + y;

}

 

public bool IsBetween(int i) {

if (x < i && i < y) return true;

else return false;

}

 

public void Set(int a, int b) {

x = a;

y = b;

}

 

public void Set(double a, double b) {

x = (int)a; y = (int)b;

}

 

public void Show() {

Console.WriteLine(" x: {0}, у: {1}", x, y);

}

}

 

class ReflectDemo {

static void Main() {

Type t = typeof(MyClass); // получить объект класса Type,

Представляющий класс MyClass

Console.WriteLine("Анализ методов, определенных " +

"в классе " + t.Name);

Console.WriteLine();

Console.WriteLine("Поддерживаемые методы: ");

MethodInfo[] mi = t.GetMethods();


Дата добавления: 2019-02-12; просмотров: 282; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!