2011-07-05 4 views
0

데이터베이스에 일부 항목이 있습니다. 각각의 브라우저에는 Browsable, IsInMenu 등과 같은 많은 태그가있을 수 있습니다. 내 친구가 Flags 특성을 사용하여 enum을 사용하여 확장 가능한 솔루션을 만들 것을 제안했습니다.Flags 특성을 사용하는 방법은 무엇입니까?

public List<Item> GetItems(ItemTags tags) 
{ 
    /* 
    Code to get data from DB, something like, 
    return repository.GetList(tags); 
    */ 
}  
: 내가 좋아하는 것

이제
[Flags] 
public enum ItemTags { Browsable = 2, IsInMenu = 4} 

이 방법 의미 일부 항목의 목록을 얻을 수있을 것 : 그래서, 그때 내가이 열거를 생성, 정수 값을 취 DB의 필드를 생성

및 UI에서 , 내가 전화하고 싶습니다 :

List<Item> items = GetItems(ItemTags.Browsable | ItemTags.IsInMneu); 

하지만 원하는 결과를 얻을 수 없습니다. 나는 바른 길을 가고 있는가? 원하는 결과에 의해 다음을 의미합니다. 데이터베이스에 저장된 값은 이제 0, 2, 4, 6 값 중 하나 일 수 있습니다. 0은 항목이 Menu에없고 Browsable이 아님을 의미합니다. 2 해당 항목이 브라우징 가능하지만 메뉴에는 없음을 의미합니다. 4는 항목이 메뉴에 있지만 Browsable이 아님을 나타냅니다. 6은 항목이 Browsable 및 IsInMenu임을 의미합니다. 이제 GetItems 함수를 호출하면 탐색 가능한 메뉴, 메뉴 또는 탐색 가능한 메뉴와 메뉴 모두를 가져올 수 없습니다.

답변

1

사용 있는 FlagsAttribute 클래스

는 열거 비트 필드로서 취급 될 수 있음을 나타냄; 즉, 플래그 세트 입니다. 열거 형에 대한

[Flags] 
public enum ItemTags 
{ 
    Default =0, 
    Browsable = 2, 
    IsInMenu = 4, 
    All = 6 // Browsable/IsInMenu 
} 

More here

참고 : 기본적으로

열거는 아래의 int 이 있고, C#에서 모든 정수 을하는 것처럼 열거는 기본값이 0 을 처음 만들었습니다.그래서 0 경우는 메모에 대한 잘못된 유효

+0

이 솔루션은 문제가 없습니다. 하지만 내 태그가 확장되면 어떻게 될까요? 내 말은,이 경우 모든 조합을 써야한다는 것입니다. 정말 어렵습니다. 내가 말했듯이'GetAllItems (ItemTags.All) '이 아닌'GetAllItems (ItemTags.IsInMenu | ItemTags.Browsable)'을 말할 수 있기를 원합니다. 내가 맞습니까? –

+1

나는 Flagg 속성이 ItemTags.IsInMenu와 다른 것을 나타내는 값 6을 가진 다른 enumvalue를 허용하지 않기 때문에 ItemTags.All을 할 것이라고 생각한다. ItemTags.Browsable이므로 두 옵션이 동일합니다. –

+0

확실히 이러한 플래그 값이 올바르지 않으며 2의 제곱이어야합니까? – user1

1

당신은 Flags 속성을 누락 ...

귀하의 열거

는 다음과 같이 선언한다 :

[Flags] 
public enum ItemTags { Browsable = 2, IsInMenu = 4} 

편집 :
이 갱신 한 후, 잘 보인다. 당신은 당신이 의미하는 바를 좀 더 정확히해야합니다 :

그러나 나는 원하는 결과를 얻지 못합니다.

위의 코드는 정상적으로 보입니다. 따라서 다른 곳에 문제가 있거나 응용 프로그램에서 실제로 사용하는 코드와 여기에 표시 한 코드가 다릅니다.

+0

덕분에 열거 상수 다음 열거 인스턴스화됩니다 에 매핑되지 된다. 질문을 업데이트했습니다. –

+0

@Saeed : 업데이트를 참조하십시오. –

관련 문제