Console.WriteLine("Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo[i].ToString(), att.Name);
Console.WriteLine("Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo[i].ToString(), att.Level);
Console.WriteLine("Атрибут Проверено на уровне метода {0}: {1}.\n", MyMemberInfo[i].ToString(), att.Reviewed);
}
}
}
MC++
using namespace System;
using namespace System::Reflection;
public: static void GetAttribute(Type* t) { // Получить атрибут уровня класса. DeveloperAttribute* att = __try_cast<DeveloperAttribute*>(Attribute::GetCustomAttribute(t, __typeof(DeveloperAttribute))); if (att == 0) Console::WriteLine(S"Класс {0} не имеет атрибута Developer.\n", t->ToString()); else { Console::WriteLine(S"Атрибут Имя на уровне класса: {0}.", att->Name); Console::WriteLine(S"Атрибут Уровень на уровне класса: {0}.", att->Level); Console::WriteLine(S"Атрибут Проверено на уровне класса: {0}.\n", att->Reviewed); } // Получить атрибуты уровня методов. // Получить все методы данного класса и поместить их // в массив объектов System.Reflection.MemberInfo. MemberInfo* MyMemberInfo __gc[] = t->GetMethods(); // Вывести атрибуты всех методов класса for (int i = 0; i < MyMemberInfo.Length; i++) { att = __try_cast<DeveloperAttribute*>(Attribute::GetCustomAttribute(MyMemberInfo[i], __typeof(DeveloperAttribute))); if (att == 0) Console::WriteLine(S"Метод {0} не имеет атрибута Developer.\n" , MyMemberInfo[i]->ToString()); else { Console::WriteLine(S"Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo[i]->ToString(), att->Name); Console::WriteLine(S"Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo[i]->ToString(), att->Level); Console::WriteLine(S"Атрибут Проверено на уровне метода {0}: {1}.\n", MyMemberInfo[i]->ToString(), att->Reviewed); } } } Visual Basic.NET Imports System Imports System.Reflection Public Shared Sub GetAttribute(t As Type) ' Получить атрибут уровня класса. Dim att As DeveloperAttribute = _ ype(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute) If att Is Nothing Then Console.WriteLine("Класс {0} не имеет атрибута Developer.", t.ToString()) Else Console.WriteLine("Атрибут Имя на уровне класса: {0}.", att.Name) Console.WriteLine("Атрибут Уровень на уровне класса: {0}.", att.Level) Console.WriteLine("Атрибут Проверено на уровне класса: {0}.", att.Reviewed) End If ' Получить атрибуты уровня методов. ' Получить все методы данного класса и поместить их ' в массив объектов System.Reflection.MemberInfo. Dim MyMemberInfo As MemberInfo() = t.GetMethods() ' Вывести атрибуты всех методов класса Dim i As Integer For i = 0 To MyMemberInfo.Length – 1 att = CType(Attribute.GetCustomAttribute(MyMemberInfo(i), GetType(DeveloperAttribute)), DeveloperAttribute) If att Is Nothing Then Console.WriteLine("Метод {0} не имеет атрибута Developer.", MyMemberInfo(i).ToString()) Else Console.WriteLine("Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Name) Console.WriteLine("Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Level) Console.WriteLine("Атрибут Проверено на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Reviewed) End If Next i End Sub Для доступа к методам и полям проверяемого класса используются методы класса System::Type. В этом примере сначала через Type запрашивается информация об атрибутах, определенных на уровне класса, затем, через метод Type.GetMethods получается информация обо всех атрибутах, определенных на уровне методов. Эта информация помещается в массив объектов типа System.Reflection.MemberInfo. Если нужны атрибуты свойств, используется метод Type.GetProperties, а для конструкторов – Type.GetConstructors. Класс Type имеет множество методов для доступа к элементам типа, здесь описана только очень небольшая часть.
Это все на сегодня. Пока!
public: static void GetAttribute(Type* t) { // Получить атрибут уровня класса. DeveloperAttribute* att = __try_cast<DeveloperAttribute*>(Attribute::GetCustomAttribute(t, __typeof(DeveloperAttribute))); if (att == 0) Console::WriteLine(S"Класс {0} не имеет атрибута Developer.\n", t->ToString()); else { Console::WriteLine(S"Атрибут Имя на уровне класса: {0}.", att->Name); Console::WriteLine(S"Атрибут Уровень на уровне класса: {0}.", att->Level); Console::WriteLine(S"Атрибут Проверено на уровне класса: {0}.\n", att->Reviewed); } // Получить атрибуты уровня методов. // Получить все методы данного класса и поместить их // в массив объектов System.Reflection.MemberInfo. MemberInfo* MyMemberInfo __gc[] = t->GetMethods(); // Вывести атрибуты всех методов класса for (int i = 0; i < MyMemberInfo.Length; i++) { att = __try_cast<DeveloperAttribute*>(Attribute::GetCustomAttribute(MyMemberInfo[i], __typeof(DeveloperAttribute))); if (att == 0) Console::WriteLine(S"Метод {0} не имеет атрибута Developer.\n" , MyMemberInfo[i]->ToString()); else { Console::WriteLine(S"Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo[i]->ToString(), att->Name); Console::WriteLine(S"Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo[i]->ToString(), att->Level); Console::WriteLine(S"Атрибут Проверено на уровне метода {0}: {1}.\n", MyMemberInfo[i]->ToString(), att->Reviewed); } } } Visual Basic.NET Imports System Imports System.Reflection Public Shared Sub GetAttribute(t As Type) ' Получить атрибут уровня класса. Dim att As DeveloperAttribute = _ ype(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute) If att Is Nothing Then Console.WriteLine("Класс {0} не имеет атрибута Developer.", t.ToString()) Else Console.WriteLine("Атрибут Имя на уровне класса: {0}.", att.Name) Console.WriteLine("Атрибут Уровень на уровне класса: {0}.", att.Level) Console.WriteLine("Атрибут Проверено на уровне класса: {0}.", att.Reviewed) End If ' Получить атрибуты уровня методов. ' Получить все методы данного класса и поместить их ' в массив объектов System.Reflection.MemberInfo. Dim MyMemberInfo As MemberInfo() = t.GetMethods() ' Вывести атрибуты всех методов класса Dim i As Integer For i = 0 To MyMemberInfo.Length – 1 att = CType(Attribute.GetCustomAttribute(MyMemberInfo(i), GetType(DeveloperAttribute)), DeveloperAttribute) If att Is Nothing Then Console.WriteLine("Метод {0} не имеет атрибута Developer.", MyMemberInfo(i).ToString()) Else Console.WriteLine("Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Name) Console.WriteLine("Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Level) Console.WriteLine("Атрибут Проверено на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Reviewed) End If Next i End Sub Для доступа к методам и полям проверяемого класса используются методы класса System::Type. В этом примере сначала через Type запрашивается информация об атрибутах, определенных на уровне класса, затем, через метод Type.GetMethods получается информация обо всех атрибутах, определенных на уровне методов. Эта информация помещается в массив объектов типа System.Reflection.MemberInfo. Если нужны атрибуты свойств, используется метод Type.GetProperties, а для конструкторов – Type.GetConstructors. Класс Type имеет множество методов для доступа к элементам типа, здесь описана только очень небольшая часть.
Пример
Демонстрационная программа, показывающая, как можно получать информацию из секций метаданных, написана на C#. На рисунке показана закладка, на которой можно увидеть значения атрибутов для сборки, на других закладках показывается аналогичная информация. Я не буду подробно описывать пример, кому надо, может скачать и скомпилировать его. Пример достаточно прост и разобраться в том, как получаются атрибуты, ни для кого не составит труда.Заключение
Как видите, система метаданных в среде .NET достаточно хорошо продумана, и пользоваться ей легко и удобно.Это все на сегодня. Пока!
Алекс Jenter jenter@rsdn.ruDuisburg, 2001. Публикуемые в рассылке материалы принадлежат сайту RSDN.