Чтение онлайн

ЖАНРЫ

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

MC++

[Developer(S"Иван Семенов", S"1")]

[Developer(S"Иван Семенов", S"1", Reviewed = true)]

Visual Basic.NET

<Developer("Иван Семенов", "1")>

<Developer("Иван Семенов", "1", Reviewed := True)>

В первом примере показано применение атрибута с одним обязательным параметром, а во втором – с обоими типами параметров.

Доступ к информации, хранящейся в атрибутах

Теперь настало время рассмотреть механизм получения атрибутов, ведь мало научиться сохранять свои атрибуты в метаданных, важно еще и уметь получать и использовать

их. К счастью, получение пользовательского атрибута – простая задача. Сначала объявляется переменная с типом атрибута, который нужно получить, затем она инициализируется с помощью вызова метода Attribute.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 возвращает нулевое значение. В этом примере предполагается, что атрибут определен в текущем пространстве имен, если это не так, не забудьте импортировать соответствующее пространство имен.

Получение списка однотипных атрибутов

В предыдущем примере ссылки на класс и атрибут передавались в метод GetCustomAttribute. Этот код прекрасно работает, если на уровне класса определен только один атрибут. Но если на том же уровне определено несколько однотипных атрибутов, этот метод вернет не всю информацию. В таких случаях нужно использовать метод Attribute.GetCustomAttributes, который возвращает массив атрибутов. Например, если на уровне класса определены два экземпляра атрибута DeveloperAttribute, можно модифицировать метод GetAttribute, чтобы получить оба.

Как это сделать, показано в следующем примере:

C#

public static void GetAttribute(Type t) {

 // Получить атрибут.

 DeveloperAttribute[] MyAttribute =

(DeveloperAttribute[]) Attribute.GetCustomAttributes(t, typeof(DeveloperAttribute));

 if (MyAttribute == null) Console.WriteLine("Атрибут не найден.");

 else for (int i = 0; i < MyAttribute.Length; i++) {

// Получить поле Имя.

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