public virtual bool Reviewed {
get {
return reviewed;
}
set {
reviewed = value;
}
}
}
MC++
#using
[AttributeUsage(AttributeTargets::All)]
public __gc class DeveloperAttribute : public System::Attribute {
private:
// Закрытые поля.
String* name;
String* level;
Boolean reviewed;
public:
// Конструктор принимает два обязательных параметра: имя и уровень.
DeveloperAttribute(String* name, String* level) {
this->name = name;
this->level = level;
this->reviewed = false;
}
// Свойство Name.
// Только для чтения.
__property virtual String* get_Name() { return name; }
// Свойство Level.
// Только для чтения.
__property virtual String* get_Level() { return level; }
// Свойство Reviewed.
// Чтение / Запись.
__property virtual Boolean get_Reviewed() { return reviewed; }
__property virtual void set_Reviewed(Boolean value) { reviewed = value; }
}
Visual Basic.NET
Public Class DeveloperAttribute
Inherits System.Attribute
' Закрытые поля.
Private name As String
Private level As String
Private reviewed As Boolean
' Конструктор принимает два обязательных параметра: имя и уровень.
Public Sub New(name As String, level As String)
Me.name = name
Me.level = level
Me.reviewed = False
End Sub
' Свойство Name.
' Только для чтения.
Public Overridable ReadOnly Property Name() As String
Get
Return name
End Get
End Property
' Свойство Level.
' Только для чтения.
Public Overridable ReadOnly Property Level() As String
Get
Return level
End Get
End Property
' Свойство Reviewed.
' Чтение / Запись.
Public Overridable Property Reviewed() As Boolean
Get
Return reviewed
End Get
Set
reviewed = value
End Set
End Property
End Class
Применять этот атрибут можно, используя как полное имя DeveloperAttribute, так и сокращенное – Developer:
C#
[Developer("Иван Семенов", "1")]
[Developer("Иван Семенов", "1", Reviewed = true)]
MC++
[Developer(S"Иван Семенов", S"1")]
[Developer(S"Иван Семенов", S"1", Reviewed = true)]
Visual Basic.NET
В первом примере показано применение атрибута с одним обязательным параметром, а во втором – с обоими типами параметров.
Доступ к информации, хранящейся в атрибутах
Теперь настало время рассмотреть механизм получения атрибутов, ведь мало научиться сохранять свои атрибуты в метаданных, важно еще и уметь получать и использовать их. К счастью, получение пользовательского атрибута – простая задача. Сначала объявляется переменная с типом атрибута, который нужно получить, затем она инициализируется с помощью вызова метода 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 using namespace System;
[Developer(S"Иван Семенов", S"42", Reviewed = true)]
public__gc class MainApp{
public:
static void GetAttribute(Type* t) {
// Получить атрибут.
DeveloperAttribute* MyAttribute =
__try_cast
(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);
}
}
};
Читать дальше