C#-检查属性';s在enum'上的存在性;s元素

C#-检查属性';s在enum'上的存在性;s元素,c#,attributes,enums,elements,defined,C#,Attributes,Enums,Elements,Defined,我遇到的情况如下: enum Header { Sync, [OldProtocol] Keepalive, Ping, [OldProtocol] Auth, [OldProtocol] LoginData //... } 我需要获得一个元素数组,其中定义了OldProtocolAttribute。我注意到属性.IsDefined()方法及其重载显然不支持这种情况 我的问题是: 有没有一种方法可以不在解决方案的任何部分中使用typeof(He

我遇到的情况如下:

enum Header
{
    Sync,
    [OldProtocol] Keepalive,
    Ping,
    [OldProtocol] Auth,
    [OldProtocol] LoginData
    //...
}
我需要获得一个元素数组,其中定义了
OldProtocolAttribute
。我注意到
属性.IsDefined()
方法及其重载显然不支持这种情况

我的问题是:

  • 有没有一种方法可以不在解决方案的任何部分中使用
    typeof(Header).GetField()
  • 如果不是,解决问题的最佳方法是什么

据我所知,您必须从字段中获取属性。您可以使用:

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

@Jon Skeet,u miss)“after.”Where(field=>field.IsDefined(attributeType,false)“-此代码不会编译。实际上它会在内部缓存。@AridaneÁlamo:
IsDefined
可能会缓存,但如果OP经常需要整个字段数组,则值得缓存它。