C# - проверить наличие атрибута в элементе перечисления

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

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

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

мой вопрос:

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

2 ответов


насколько мне известно, вы должны получить атрибут из поля. Ты используешь:

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();

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


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

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