2013-06-11 6 views
3
public enum Animal 
{ 
    [Description("King of jungle")] 
    Lion= 1, 

    [Description("Tallest there")] 
    Giraffe = 2 
} 

Пусть у меня есть FieldInfo, я могу это сделать двумя способами:Почему MemberInfo.GetCustomAttributes (Тип) определен для возврата массива атрибутов?

//static one on 'Attribute' class 
Attribute attribute = Attribute.GetCustomAttribute(field, 
                typeof(DescriptionAttribute), 
                false); 

Это нормально.

Но один ниже возвращает [], а не Attribute?

//instance one on 'MemberInfo` class 
var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false); 

Этот вопрос не совсем о выборе дизайна MS. Мой вопрос в том, должен ли я когда-либо беспокоиться о возврате нескольких элементов для определенного типа атрибута field.GetCustomAttributes? В каких случаях это произойдет?

никогда не возможно. Я думаю, что я должен справиться с этим при написании некоторых вспомогательных функций отражения.

+2

Как насчет нескольких атрибутов, полученных из одного и того же базового типа? Можно было бы запросить все это? Например, XmlArrayItemAttribute. – Alex

+0

@Alex Я провел некоторое тестирование таким образом, и у меня все еще есть только один атрибут в массиве. Не могли бы вы дать ему ответ на примере? – nawfal

ответ

2

Имеет смысл возвратить несколько элементов для каждого типа атрибута. Подумайте об атрибутах, разработанных с базовым классом. Или атрибуты, где вы могли бы предоставить несколько вариантов/типов конструктором.

Одним из примеров является XmlArrayItemAttribute Смотрите MSDN: XmlArrayItemAttribute Class

Если вы хотите ограничить ваши атрибуты, которые будут использоваться только один раз, вы можете добавить allowmultiple:=False флаг вашей AttributeUsage.

@comment

The DescriptionAttribute имеет AllowMultiple: = False (это значение по умолчанию, если вы не specifiy - по крайней мере, в VB.NET). Чтобы получить эффект, создайте свой собственный атрибут, полученный из Attribute, и отметьте его AttributeUsage, где вы установили AllowMultiple = True.

+0

То есть, но какая родительская дочерняя пара имеет эти атрибуты? Я попытался с некоторыми примерами и не получил больше одного в массиве. Не могли бы вы придумать пример, чтобы получить эффект? Может быть, я что-то упустил. Я попытаюсь также обновить этот вопрос на моем примере. – nawfal

+0

Алекс, блестящий, это редактирование имело смысл. Его о 'AllowMultiple = True', а не наследовании. Не могли бы вы удалить эту часть, связанную с 'XmlArrayItemAttribute' и наследованием? Или это действительно связано с ответом? Я так не думаю. – nawfal

+0

Теперь большой вопрос, почему 'Attribute.GetCustomAttribute' определяется вообще! На мой взгляд, статическая функция ненадежна просто, а простая уродливая :) – nawfal