C# - 检查枚举元素上的属性是否存在

15

我有一个类似以下情况的问题:

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

我需要获取定义了OldProtocolAttribute的元素数组。我注意到Attribute.IsDefined()方法和它的重载似乎不支持这种情况。

我的问题是:

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

28
据我所知,您需要从字段中获取属性。您可以使用以下代码:

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

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

很明显,如果你需要经常使用这个功能,你可能希望缓存结果。


@Jon Skeet,你在".Where(field => field.IsDefined(attributeType, false)"后面漏掉了一个")" - 这段代码无法编译。 - nuclear sweet
实际上它会在内部进行缓存。 - Aridane Álamo
@AridaneÁlamo:IsDefined 可能会缓存,但如果 OP 经常需要整个字段数组,那么值得缓存。 - Jon Skeet

5

反射机制是您在此情况下唯一可用的工具。但查询并不太复杂:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接