Алекс Jenter - Программирование на Visual C++. Архив рассылки
- Название:Программирование на Visual C++. Архив рассылки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алекс Jenter - Программирование на Visual C++. Архив рассылки краткое содержание
РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.
Программирование на Visual C++. Архив рассылки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
__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);
}
}
};
void main() {
// Вызвать функцию получения и отображения атрибута.
MainApp::GetAttribute(__typeof(MainApp));
}
Visual Basic.NET
Imports System
Class 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++) {
// Получить поле Имя.
Console.WriteLine("Имя: {0}." , MyAttribute[i].Name);
// Получить поле Уровень.
Console.WriteLine("Уровень: {0}." , MyAttribute[i].Level);
// Получить поле Проверено.
Console.WriteLine("Проверено: {0}.", MyAttribute[i].Reviewed);
}
}
MC++
public:
static void GetAttribute(Type* t) {
// Получить атрибут.
DeveloperAttribute* MyAttribute __gc[] =
__try_cast(Attribute::GetCustomAttributes(t, __typeof(DeveloperAttribute)));
if (MyAttribute == 0) Console::WriteLine(S"Атрибут не найден.");
else for (int i = 0; i < MyAttribute.Length; i++) {
// Получить поле Имя.
Console::WriteLine(S"Имя: {0}." , MyAttribute[i]->Name);
// Получить поле Уровень.
Console::WriteLine(S"Уровень: {0}." , MyAttribute[i]->Level);
// Получить поле Проверено.
Console::WriteLine(S"Проверено: {0}." , MyAttribute[i]->Reviewed);
}
}
Visual Basic.NET
Public Shared Sub GetAttribute(t As Type)
' Получить атрибут.
Dim MyAttribute As DeveloperAttribute() = _
CType(Attribute.GetCustomAttributes(t, GetType(DeveloperAttribute)), DeveloperAttribute())
Интервал:
Закладка: