- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Программирование на Visual C++. Архив рассылки - Алекс Jenter
Шрифт:
Интервал:
Закладка:
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<DeveloperAttribute* __gc[]>(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())
If MyAttribute Is Nothing Then
Console.WriteLine("Атрибут не найден.")
Else
Dim i As Integer
For i = 0 To MyAttribute.Length – 1 ' Получить поле Имя.
Console.WriteLine("Имя: {0}.", MyAttribute(i).Name)
' Получить поле Уровень.
Console.WriteLine("Уровень: {0}.", MyAttribute(i).Level)
' Получить поле Проверено.
Console.WriteLine("Проверено: {0}.", MyAttribute(i).Reviewed)
Next i
End If
End Sub
Получение списка разнотипных атрибутовМетоды GetCustomAttribute и GetCustomAttributes не могут искать атрибут во всем классе и возвращать все его экземпляры. Они просматривают только один метод или поле за раз. Поэтому, если есть класс с одним атрибутом для всех методов и нужно получить все экземпляры этого атрибута, не остается ничего делать, как передавать эти методы один за другим в качестве параметров GetCustomAttribute и GetCustomAttributes.
В следующем фрагменте кода показано, как получить все экземпляры атрибута DeveloperAttribute, определенного как на уровне класса, так и на уровне методов.
C#
using System;
using System.Reflection;
public static void GetAttribute(Type t) {
// Получить атрибут уровня класса.
DeveloperAttribute att =
(DeveloperAttribute) Attribute.GetCustomAttribute (t, typeof(DeveloperAttribute));
if (att == null)
Console.WriteLine("Класс {0} не имеет атрибута Developer.n", t.ToString());
else {
Console.WriteLine("Атрибут Имя на уровне класса: {0}.", att.Name);
Console.WriteLine("Атрибут Уровень на уровне класса: {0}.", att.Level);
Console.WriteLine("Атрибут Проверено на уровне класса: {0}.n", att.Reviewed);
}
// Получить атрибуты уровня методов.
// Получить все методы данного класса и поместить их
// в массив объектов System.Reflection.MemberInfo.
MemberInfo[] MyMemberInfo = t.GetMethods();
// Вывести атрибуты всех методов класса
for (int i = 0; i < MyMemberInfo.Length; i++) {
att =
(DeveloperAttribute)Attribute.GetCustomAttribute(MyMemberInfo[i], typeof (DeveloperAttribute));
if (att == null)
Console.WriteLine("Метод {0} не имеет атрибута Developer.n" ,
MyMemberInfo[i].ToString());
else {
Console.WriteLine("Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo[i].ToString(), att.Name);
Console.WriteLine("Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo[i].ToString(), att.Level);
Console.WriteLine("Атрибут Проверено на уровне метода {0}: {1}.n", MyMemberInfo[i].ToString(), att.Reviewed);
}
}
}
MC++
using namespace System;
using namespace System::Reflection;
public:
static void GetAttribute(Type* t) {
// Получить атрибут уровня класса.
DeveloperAttribute* att = __try_cast<DeveloperAttribute*>(Attribute::GetCustomAttribute(t, __typeof(DeveloperAttribute)));
if (att == 0)
Console::WriteLine(S"Класс {0} не имеет атрибута Developer.n", t->ToString());
else {
Console::WriteLine(S"Атрибут Имя на уровне класса: {0}.", att->Name);
Console::WriteLine(S"Атрибут Уровень на уровне класса: {0}.", att->Level);
Console::WriteLine(S"Атрибут Проверено на уровне класса: {0}.n", att->Reviewed);
}
// Получить атрибуты уровня методов.
// Получить все методы данного класса и поместить их
// в массив объектов System.Reflection.MemberInfo.
MemberInfo* MyMemberInfo __gc[] = t->GetMethods();
// Вывести атрибуты всех методов класса
for (int i = 0; i < MyMemberInfo.Length; i++) {
att =
__try_cast<DeveloperAttribute*>(Attribute::GetCustomAttribute(MyMemberInfo[i], __typeof(DeveloperAttribute)));
if (att == 0)
Console::WriteLine(S"Метод {0} не имеет атрибута Developer.n" , MyMemberInfo[i]->ToString());
else {
Console::WriteLine(S"Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo[i]->ToString(), att->Name);
Console::WriteLine(S"Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo[i]->ToString(), att->Level);
Console::WriteLine(S"Атрибут Проверено на уровне метода {0}: {1}.n", MyMemberInfo[i]->ToString(), att->Reviewed);
}
}
}
Visual Basic.NET
Imports System
Imports System.Reflection
Public Shared Sub GetAttribute(t As Type)
' Получить атрибут уровня класса.
Dim att As DeveloperAttribute = _
ype(Attribute.GetCustomAttribute(t, GetType(DeveloperAttribute)), DeveloperAttribute)
If att Is Nothing Then
Console.WriteLine("Класс {0} не имеет атрибута Developer.", t.ToString())
Else
Console.WriteLine("Атрибут Имя на уровне класса: {0}.", att.Name)
Console.WriteLine("Атрибут Уровень на уровне класса: {0}.", att.Level)
Console.WriteLine("Атрибут Проверено на уровне класса: {0}.", att.Reviewed)
End If
' Получить атрибуты уровня методов.
' Получить все методы данного класса и поместить их
' в массив объектов
System.Reflection.MemberInfo.
Dim MyMemberInfo As MemberInfo() = t.GetMethods()
' Вывести атрибуты всех методов класса
Dim i As Integer
For i = 0 To MyMemberInfo.Length – 1
att =
CType(Attribute.GetCustomAttribute(MyMemberInfo(i), GetType(DeveloperAttribute)), DeveloperAttribute)
If att Is Nothing Then
Console.WriteLine("Метод {0} не имеет атрибута Developer.", MyMemberInfo(i).ToString())
Else
Console.WriteLine("Атрибут Имя на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Name)
Console.WriteLine("Атрибут Уровень на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Level)
Console.WriteLine("Атрибут Проверено на уровне метода {0}: {1}.", MyMemberInfo(i).ToString(), att.Reviewed)
End If
Next i
End Sub
Для доступа к методам и полям проверяемого класса используются методы класса System::Type. В этом примере сначала через Type запрашивается информация об атрибутах, определенных на уровне класса, затем, через метод Type.GetMethods получается информация обо всех атрибутах, определенных на уровне методов. Эта информация помещается в массив объектов типа System.Reflection.MemberInfo. Если нужны атрибуты свойств, используется метод Type.GetProperties, а для конструкторов – Type.GetConstructors. Класс Type имеет множество методов для доступа к элементам типа, здесь описана только очень небольшая часть.
ПримерДемонстрационная программа, показывающая, как можно получать информацию из секций метаданных, написана на C#. На рисунке показана закладка, на которой можно увидеть значения атрибутов для сборки, на других закладках показывается аналогичная информация. Я не буду подробно описывать пример, кому надо, может скачать и скомпилировать его. Пример достаточно прост и разобраться в том, как получаются атрибуты, ни для кого не составит труда.
ЗаключениеКак видите, система метаданных в среде .NET достаточно хорошо продумана, и пользоваться ей легко и удобно.
Это все на сегодня. Пока!
Алекс Jenter [email protected] Duisburg, 2001. Публикуемые в рассылке материалы принадлежат сайту RSDN.