.NET Flag Enum obtiene atributos de valores

Saludos StackOverflow,

Si tengo un tipo de enumeración con el atributo Flag, así como los valores de este tipo de enumeración con sus propios atributos, ¿cómo puedo recuperar todos los atributos apropiados?

Por ejemplo:

[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 ... } 

Una forma rápida y sucia utilizando 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(); 

O en la syntax de consulta:

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

Alternativamente, si es posible que haya múltiples atributos en cada campo, probablemente querrá hacer esto:

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

O en la syntax de consulta:

 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;