Иллюстрированный самоучитель по Architecture .NET

Класс туре (Тип)

Перевод такой:

Интерфейсы:
ICustomer
Поля:
Свойства:
События:
Конструкторы:
public.ctor() Методы:
public Void ChangeEmailAddress(System.Int32 id,
System.String emailAddress)
public ArrayList GetCustomer(System.Int32 id)
public Void UnregisterCustomer(System.Int32 id)
public Int32 RegisterCustomer(System.String firstName,
System.String lastName, System.String emailAddress)
public Int32 GetHashCode()
public Boolean Equals(System.Object obj)
public String ToString()
public Type GetType()

Вся эта информация была получена с помощью методов Getlnterfaces, GetFields, GetProperties, GetEvents, GetConstructors и GetMethods класса Type (Тип). Поскольку интерфейс – тип, Getlnterfaces возвращает массив объектов Type (Тип), представляющий интерфейсы, унаследованные или реализованные запрошенным типом Type (Тип). А так как поля, свойства, события, и методы – не типы, их методы средств доступа не возвращают объекты Type (Тип). Каждый из их методов доступа возвращает соответствующий класс: Fieldlnfo, Propertylnfo, Eventlnfo, Constructorlnfо и Methodlnfо. Все эти классы, а также класс Type (Тип), – производные от класса Memberlnfo, который является абстрактным базовым классом для элементов метаданных.

Давайте рассмотрим некоторые из метаданных, связанные с методом класса. Используя методы отражения, мы можем восстановить сигнатуры для всех классов и интерфейсов в сборке Customer (Клиент). Вот распечатка для методов класса Customer (Клиент):

public Void ChangeEmailAddress(System.Int32 id,
System.String emailAddress)
public ArrayList GetCustomer(System.Int32 id)
public Void UnregisterCustomer(System.Int32 id)
public Int32 RegisterCustomer(System.String firstName,
System.String lastName, System.String emailAddress)
public Int32 GetHashCode()
public Boolean Equals(System.Object obj)
public String ToString()
public Type GetType()

Вот код, с помощью которого была получена эта распечатка:

for (int j = 0; j < methodlnfо.Length; j++)
{
if (methodlnfo[j] › IsStatic)
Console::Write (" static "); // статический
if (methodlnfo[j] › IsPublic)
Console::Write(" public ");
if (methodlnfo[j] › IsFamily)
Console::Write(" protected "}; // защищенный
if (methodlnfo[j] › IsAssembly)
Console::Write(" internal "); // внутренний
if (methodlnfо[j] › IsPrivate)
Console::Write(" private "); // частный
Console::Write(
"{0} ", methodlnfo[j] › ReturnType › Name); // Имя
Console::Write(// Запись
"{0}(", methodlnfo[j] › Name); // Имя
Parameterlnfo *paramlnfo [] =
methodlnfo[j] › GetParameters(};
long last = paramlnfo › Length -1;
for (int k = 0; k<param!nfo › Length; k++)
{
Console::Write(// Запись
"{0} {1}",
paramlnfо[k] › ParameterType,
paramlnfо[k] › Name); // Имя
if (k!= last) // если не последний
Console::Write(", "); // Запись
}
Console::WriteLine(")");
}

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

Класс Methodlnfo содержит свойства, с помощью которых можно определить, является ли метод статическим, приватным, защищенным или внутренним, а также возвращаемый тип (тип результата) и название метода. Параметры метода сохраняются в массиве свойств типа (класса) Parameterlnfo.

Этот пример показывает, что типы относятся к сборкам. Два типа, имеющие одинаковые имена, но размещенные в двух различных сборках, трактуются во время выполнения как два разных типа. Нужно быть внимательным при смешивании различных версий типов или тех же самых типов в двух различных сборках.

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.