2013-08-12 3 views
3

인사에 StackOverflow,.NET 신고 열거 GET 값에서 속성

나는 국기와 함께 열거 형은 내가 모두를 검색 할 수있는 방법, 자신의 속성이 열거 형의 값뿐만 아니라 속성을 가지고있는 경우에 적절한 속성?

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

또는 경우를 가능한 여러 속성이있을 수 Linq에를 사용하여

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

답변

7

신속하고 더러운 방법 :

예를 들어

각 입력란에서이 작업을 수행하는 것이 좋습니다.

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

또는 쿼리 구문 10 :

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; 
+0

와우,이 환상적이다. 나는 바로 이것을 시도 할 것이다. – LamdaComplex

+0

더 많은 커피가 필요 하겠지만'Where (v => (enumVar & v)! = v)'절이 맞습니까? '(enumVar & v) == v' 또는'(enumVar & v)! = 0'이 아니어야합니까? 편집 : 신경 쓰지 마세요, 커피 좀 갖다 드리죠. EDITx2 : 아니, 나는 내가 옳다고 생각해. 오 이런, 나는 내 마음을 잃어 가고있어. –

+0

@ChrisSinclair 예 처음에는'! = 0'을 사용 했었지만'== v'가 더 좋을 수도 있지만 ('! ='를 수정하지는 못했지만) 실제로'.HasFlag (v)'가 둘 다. 나는 커피도 필요하다고 생각한다 : p –