Про что речь: хелперы для поиска атрибутов в определённом порядке:
1. метод / свойство / событие, затем базовые методы (если метод виртуальный)
2. тип, в котором объявлен метод + базовые типы для него
3. container types + базовые типы для них (если тип из п.2 — nested type)
4. сборка, в которой объявлен тип из п.2.
Зачем надо: позволяет малой кровью создавать очень гибкие системы настроек на атрибутах с учётом приоритета атрибутов (порядок атрибутов, возвращаемых reflection api не документирован, если что).
Пример использования: документация, весь код для этой фичи:
foreach (var featureAttribute in metadataSource
.GetMetadataAttributes<CompetitionFeaturesAttribute>()
.Reverse())
{
competitionFeatures.Apply(featureAttribute.GetFeatures());
}
Пример получения атрибутов в коде:
var attributes = method.GetMetadataAttributes<ISomeInterface>(); // all attributes that implement the interface, including attributes in parent types / container types / assembly
var att2 = type.GetMetadataAttributes<ResourceFileAttribute>(); // ResourceFileAttribute attributes, including attributes in container types / assembly
var att3 = assembly.GetMetadataAttributes<ResourceFileAttribute>(); // ResourceFileAttribute attributes for the assembly
Собсно вопрос: оно нам надо?
Здравствуйте, Sinix, Вы писали:
S>Про что речь: хелперы для поиска атрибутов в определённом порядке:
S>1. метод / свойство / событие, затем базовые методы (если метод виртуальный)
S>2. тип, в котором объявлен метод + базовые типы для него
S>3. container types + базовые типы для них (если тип из п.2 — nested type)
S>4. сборка, в которой объявлен тип из п.2.
Ну если только не сильно наворачивать. Потому что в сложных сценариях есть специализорованные вещи типа MEF и CodeJam.Ext.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Ну если только не сильно наворачивать. Потому что в сложных сценариях есть специализорованные вещи типа MEF и CodeJam.Ext.
Закинул, не наворачивая.
Единственный момент, который мне не совсем нравится — порядок атрибутов, объявленных на одном уровне.
Сейчас атрибуты возвращаются в том порядке, в котором они объявлены (тесты подтверждают), но это поведение не документировано и может поменяться в будущем (оно уже ломалось в прошлом, чинили) + не факт, что поведение под mono будет совпадать.
Как вариант, могу добавить перегрузку с параметром Comparer<TAttribute>.
UPD Если несложно, выпусти бету с правками по MetadataAttributes