Программирование на Visual C++. Архив рассылки [Алекс Jenter] (fb2) читать постранично, страница - 260


 [Настройки текста]  [Cбросить фильтры]

 // Только для чтения.

 public virtual string Name {

  get {

   return name;

  }

 }

 // Свойство Level.

 // Только для чтения.

 public virtual string Level {

  get {

   return level;

  }

 }

 // Свойство Reviewed.

 // Чтение / Запись.

 public virtual bool Reviewed {

  get {

   return reviewed;

  }

  set {

   reviewed = value;

  }

 }

}

MC++

#using <mscorlib.dll>

[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 <AttributeUsage(AttributeTargets.All)> 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

<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

При