c# - .NET Flag Enum 从值中获取属性

标签 c# .net enums custom-attributes

问候 StackOverflow,

如果我有一个带有 Flag 属性的枚举类型以及此枚举类型中的值有自己的属性,我如何才能检索所有适当的属性?

例如:

[Flags()]
enum MyEnum
{
    [EnumDisplayName("Enum Value 1")]
    EnumValue1 = 1,
    [EnumDisplayName("Enum Value 2")]
    EnumValue2 = 2,
    [EnumDisplayName("Enum Value 3")]
    EnumValue3 = 4,
}

void Foo()
{
    var enumVar = MyEnum.EnumValue2 | MyEnum.EnumValue3;

    // get a collection of EnumDisplayName attribute objects from enumVar
    ...
}

最佳答案

使用 Linq 的一种快速但肮脏的方法:

IEnumerable<EnumDisplayNameAttribute> attributes = 
    Enum.GetValues(typeof(MyEnum))
        .Cast<MyEnum>()
        .Where(v => enumVar.HasFlag(v))
        .Select(v => typeof(MyEnum).GetField(v.ToString()))
        .Select(f => f.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)[0])
        .Cast<EnumDisplayNameAttribute>();

或者在查询语法中:

IEnumerable<EnumDisplayNameAttribute> attributes = 
    from MyEnum v in Enum.GetValues(typeof(MyEnum))
    where enumVar.HasFlag(v)
    let f = typeof(MyEnum).GetField(v.ToString())
    let a = f.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)[0]
    select ((EnumDisplayNameAttribute)a);

或者,如果每个字段可能有多个属性,您可能需要这样做:

IEnumerable<EnumDisplayNameAttribute> attributes = 
    Enum.GetValues(typeof(MyEnum))
        .Cast<MyEnum>()
        .Where(v => enumVar.HasFlag(v))
        .Select(v => typeof(MyEnum).GetField(v.ToString()))
        .SelectMany(f => f.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false))
        .Cast<EnumDisplayNameAttribute>();

或者在查询语法中:

IEnumerable<EnumDisplayNameAttribute> attributes = 
    from MyEnum v in Enum.GetValues(typeof(MyEnum))
    where enumVar.HasFlag(v))
    let f = typeof(MyEnum).GetField(v.ToString())
    from EnumDisplayNameAttribute a in f.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)
    select a;

关于c# - .NET Flag Enum 从值中获取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18193667/

相关文章:

c# - ZipArchive 创建无效的 ZIP 文件

java - 使用泛型作为参数并访问特定枚举的方法

c# - 在 Visual Studio 2010 中从 .NET 项目启动 C++ 项目

c# - 模型绑定(bind)字典

.net - 如何在 WebBrowser Control 中设置当前 document.domain 以避免 "Access is denied"?

.net - Linq2XML,为什么 Element()、Elements() 不工作?

c# - 在 C# 中使用枚举进行数学运算(例如 DayOfWeek)

visual-c++ - 枚举类的默认值总是0吗?

c# - 禁用 ComboBox C# 中的项目

c# - TCP 文件传输 - 几个字节错误