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