KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Алекс Jenter - Программирование на Visual C++. Архив рассылки

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн "Алекс Jenter - Программирование на Visual C++. Архив рассылки". Жанр: Программирование издательство неизвестно, год неизвестен.
Перейти на страницу:

 bool myvalue;

}

Visual Basic.NET

Public Property MyProperty As Boolean

 Get

  Return Me.myvalue

 End Get

 Set

  Me.myvalue = value

 End Set

End Property

Пример пользовательского атрибута

В этом разделе объединяется вся предыдущая информация и показывается, как создать простой атрибут, документирующий некоторый фрагмент кода. Атрибут из этого примера содержит информацию об имени и уровне программиста, а также о времени последнего пересмотра кода. Он содержит три закрытых переменных, в которых хранятся данные. Каждая переменная связана с открытым свойством для чтения и записи значений. Также имеется конструктор с двумя обязательными параметрами.

C#

[AttributeUsage(AttributeTargets.All)]

public class DeveloperAttribute : System.Attribute {

 // Закрытые поля.

 private string name;

 private string level;

 private bool reviewed;


 // Конструктор принимает два обязательных параметра: имя и уровень.

 public DeveloperAttribute(string name, string level) {

  this.name = name;

  this.level = level;

  this.reviewed = false;

 }

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

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

 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

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

Имя: Иван Семенов

Уровень: 42

Проверено: True

Если атрибут не найден, метод GetCustomAttribute возвращает нулевое значение. В этом примере предполагается, что атрибут определен в текущем пространстве имен, если это не так, не забудьте импортировать соответствующее пространство имен.

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

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

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

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*