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

本文关键字:存在 元素 枚举 检查 C#- 属性 | 更新日期: 2023-09-27 18:19:52

我遇到了如下情况:

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

我需要获得一个元素数组,在该数组上定义了OldProtocolAttribute。我注意到Attribute.IsDefined()方法及其重载显然不支持这种情况。

我的问题是:

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

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

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

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

显然,如果您经常需要这样做,您可能希望缓存结果。

Reflection几乎是您唯一可用的工具。不过,查询还不错:

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