问候 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/