Architecture Net



         

Класс туре (Тип) - часть 3


Давайте рассмотрим некоторые из метаданных, связанные с методом класса. Используя методы отражения, мы можем восстановить сигнатуры для всех классов и интерфейсов в сборке 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 и каркасу предоставлять услуги прикладным программам, потому что они могут понять структуру созданных нами типов.

CompEbook.ru Железо, дизайн, обучение и другие




Содержание  Назад  Вперед