C # - проверка существования атрибута в элементе enum - PullRequest
9 голосов
/ 07 января 2012

У меня есть такая ситуация:

enum Header
{
    Sync,
    [OldProtocol] Keepalive,
    Ping,
    [OldProtocol] Auth,
    [OldProtocol] LoginData
    //...
}

Мне нужно получить массив элементов, для которых определен OldProtocolAttribute.Я заметил, что метод Attribute.IsDefined() и его перегрузки, по-видимому, не поддерживают такого рода ситуации.

Мой вопрос:

  • Есть ли способ решить проблемубез использования какой-либо части решения typeof(Header).GetField()?
  • Если нет, какой самый оптимальный способ ее решения?

Ответы [ 2 ]

17 голосов
/ 07 января 2012

Насколько я знаю, вы должны получить атрибут с поля. Вы бы использовали:

var field = typeof(Header).GetField(value.ToString());
var old = field.IsDefined(typeof(OldProtocolAttribute), false);

Или получить целый массив:

var attributeType = typeof(OldProtocolAttribute);
var array = typeof(Header).GetFields(BindingFlags.Public |
                                     BindingFlags.Static)
                          .Where(field => field.IsDefined(attributeType, false))
                          .Select(field => (Header) field.GetValue(null))
                          .ToArray();

Очевидно, что если вам это нужно часто, вы, возможно, захотите кэшировать результаты.

4 голосов
/ 07 января 2012

Отражение - практически единственный инструмент, доступный для этого.Запрос не так уж и плох:

var oldFields = typeof(Header).GetFields(BindingFlags.Static | BindingFlags.Public).Select(field => Attribute.IsDefined(field, typeof(OldProtocolAttribute)));
...