.NET Flag Enum从值中获取属性

问候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 attributes = Enum.GetValues(typeof(MyEnum)) .Cast() .Where(v => enumVar.HasFlag(v)) .Select(v => typeof(MyEnum).GetField(v.ToString())) .Select(f => f.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)[0]) .Cast(); 

或者在查询语法中:

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

或者在查询语法中:

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