2012-01-07 3 views
8

에 속성의 존재 여부를 확인합니다C#을 - 나는 다음과 같은 상황을 가지고 열거의 요소

enum Header 
{ 
    Sync, 
    [OldProtocol] Keepalive, 
    Ping, 
    [OldProtocol] Auth, 
    [OldProtocol] LoginData 
    //... 
} 

은 내가 OldProtocolAttribute이 정의 된 요소의 배열을 얻을 필요가있다. 나는 Attribute.IsDefined() 메서드와 그 오버로드가 이런 상황을 지원하지 않는 것으로 나타났습니다.

내 질문은 : 솔루션 typeof(Header).GetField()의 어떤 부분에 사용하지 않고 문제를 해결할 수있는 방법이

  • 있습니까?
  • 그렇지 않은 경우 문제를 해결하는 가장 좋은 방법은 무엇입니까?

답변

14

필자가 알고있는 한, 필드에서 속성을 가져와야합니다. 당신이 자주 필요하면 분명히

var attributeType = typeof(OldProtocolAttribute); 
var array = typeof(Header).GetFields(BindingFlags.Public | 
            BindingFlags.Static) 
          .Where(field => field.IsDefined(attributeType, false)) 
          .Select(field => (Header) field.GetValue(null)) 
          .ToArray(); 

당신은 잘 결과를 캐시 할 수 있습니다 :

var field = typeof(Header).GetField(value.ToString()); 
var old = field.IsDefined(typeof(OldProtocolAttribute), false); 

또는 전체적으로 배열을 얻을 : 당신은 사용하십시오.

+0

감사합니다. – user1098567

+0

@Jon Skeet, "miss") "."나중에 (field => field.IsDefined (attributeType, false) "-이 코드는 컴파일되지 않습니다.) –

+0

@ nuclearsweet : 고마워요. –

4

반사는이 용도로 사용할 수있는 유일한 도구입니다. 그러나 쿼리는 그렇게 나쁘지 않습니다.

var oldFields = typeof(Header).GetFields(BindingFlags.Static | BindingFlags.Public).Select(field => Attribute.IsDefined(field, typeof(OldProtocolAttribute)));