Теперь настало время рассмотреть механизм получения атрибутов, ведь мало научиться сохранять свои атрибуты в метаданных, важно еще и уметь получать и использовать их. К счастью, получение пользовательского атрибута – простая задача. Сначала объявляется переменная с типом атрибута, который нужно получить, затем она инициализируется с помощью вызова метода Attribute.GetCustomAttribute. Все, теперь можно использовать любые доступные свойства атрибута.
void main() { // Вызвать функцию получения и отображения атрибута. MainApp::GetAttribute(__typeof(MainApp)); } Visual Basic.NET Imports System Class <Developer("Иван Семенов", "42", Reviewed := True)> MainApp Public Shared Sub Main() ' Вызвать функцию получения и отображения атрибута. GetAttribute(GetType(MainApp)) End Sub
Public Shared Sub GetAttribute(t As Type) ' Получить атрибут. Dim MyAttribute As DeveloperAttribute = _ CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute) If MyAttribute Is Nothing Then Console.WriteLine("Атрибут не найден.") Else ' Получить поле Имя. Console.WriteLine("Имя: {0}.", MyAttribute.Name) ' Получить поле Уровень. Console.WriteLine("Уровень: {0}.", MyAttribute.Level) ' Получить поле Проверено. Console.WriteLine("Проверено: {0}.", MyAttribute.Reviewed) End If End Sub End Class При запуске эта программа выдает на консоль следующие строки: Имя: Иван Семенов Уровень: 42 Проверено: True Если атрибут не найден, метод GetCustomAttribute возвращает нулевое значение. В этом примере предполагается, что атрибут определен в текущем пространстве имен, если это не так, не забудьте импортировать соответствующее пространство имен.
Получение одиночного атрибута
В следующем примере атрибут DeveloperAttribute (рассмотренный выше) применяется к классу MainApp в целом. Метод GetAttribute использует Attribyte.GetCustomAttribute для получения состояния атрибута DeveloperAttribute перед тем, как вывести информацию на консоль. C# using System; [Developer("Иван Семенов", "42", Reviewed = true)] class MainApp { public static void Main() { // Вызвать функцию получения и отображения атрибута. GetAttribute(typeof(MainApp)); } public static void GetAttribute(Type t) { // Получить атрибут. DeveloperAttribute MyAttribute = (DeveloperAttribute)Attribute.GetCustomAttribute(t, typeof(DeveloperAttribute)); if (MyAttribute == null) { Console.WriteLine("Атрибут не найден."); } else { // Получить поле Имя. Console.WriteLine("Имя: {0}." , MyAttribute.Name); // Получить поле Уровень. Console.WriteLine("Уровень: {0}." , MyAttribute.Level); // Получить поле Проверено. Console.WriteLine("Проверено: {0}." , MyAttribute.Reviewed); } } } MC++ #using <mscorlib.dll> using namespace System; [Developer(S"Иван Семенов", S"42", Reviewed = true)] public__gc class MainApp{ public: static void GetAttribute(Type* t) { // Получить атрибут. DeveloperAttribute* MyAttribute = __try_cast<DeveloperAttribute*> (Attribute::GetCustomAttribute(t, __typeof(DeveloperAttribute))); if (MyAttribute == 0) Console::WriteLine(S"Атрибут не найден."); else { // Получить поле Имя. Console::WriteLine(S"Имя: {0}." , MyAttribute->Name); // Получить поле Уровень. Console::WriteLine(S"Уровень: {0}." , MyAttribute->Level); // Получить поле Проверено. Console::WriteLine(S"Проверено: {0}." , MyAttribute->Reviewed); } } };void main() { // Вызвать функцию получения и отображения атрибута. MainApp::GetAttribute(__typeof(MainApp)); } Visual Basic.NET Imports System Class <Developer("Иван Семенов", "42", Reviewed := True)> MainApp Public Shared Sub Main() ' Вызвать функцию получения и отображения атрибута. GetAttribute(GetType(MainApp)) End Sub
Public Shared Sub GetAttribute(t As Type) ' Получить атрибут. Dim MyAttribute As DeveloperAttribute = _ CType(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute) If MyAttribute Is Nothing Then Console.WriteLine("Атрибут не найден.") Else ' Получить поле Имя. Console.WriteLine("Имя: {0}.", MyAttribute.Name) ' Получить поле Уровень. Console.WriteLine("Уровень: {0}.", MyAttribute.Level) ' Получить поле Проверено. Console.WriteLine("Проверено: {0}.", MyAttribute.Reviewed) End If End Sub End Class При запуске эта программа выдает на консоль следующие строки: Имя: Иван Семенов Уровень: 42 Проверено: True Если атрибут не найден, метод GetCustomAttribute возвращает нулевое значение. В этом примере предполагается, что атрибут определен в текущем пространстве имен, если это не так, не забудьте импортировать соответствующее пространство имен.