2016-08-23 1 views
1

당신이 다음과 같이 열거 형에 가입 할 수 있도록 다음과 같은 열거 구조비 바이너리 열거 ​​플래그 C#에서

[Flags] 
public enum Permission 
{ 
    Read = 1 << 1, 
    Create = 1 << 2, 
    Update = 1 << 3, 
    Destroy = 1 << 4 
} 

찾을 매우 일반적입니다 : Permission.Read|Permission.Create

를 지금 요구 사항의 다른 종류에 직면하고있다에게 , 그리고 내가 생각해 낸 해결책은 문제가되는 IMO 다.

나는 premissions의 여러 유형을 열거 구현의 일종 허용해야 - 몇 가지 모순을, 일부는

하지 않으며 나는 기능

[Flags] 
public enum Permission 
{ 
    Read1 = 1, 
    Read2 = 2, 
    Read3 = 3, 

    Write1 = 10, 
    Write2 = 20, 
    Write3 = 30, 

    Update1 = 100, 
    Update2 = 200, 
    Update3 = 300, 

    Destory = 1000, 

    Other = 10000, 

    SomethingElse = 100000, 

} 

의 다음과 같은 종류의 할 때이 원 ' t는 Permission.Read1|Permission.Read2을 의미합니다. 왜냐하면 각 사용자가 각각의 퍼미션에 대해 다른 비트 플래그를 사용하는 것 이외에는 사용자가 이제 읽기 권한 수준 3을 갖기 때문입니다. (이는 내 db가 INT보다 훨씬 더 큰 정수를 유지해야합니다. 나쁜 이유) 또는 사용 권한마다 다른 열거 형 (및 열) (권한에 대한 유연성이 제한됨)을 가지며 컴파일 시간 확인 형식이없는 경우 (일종의 workarroundish 런타임 검증을 생성 할 수 있음) 다른 생각이있어?

+0

다른 권한 유형입니까, 아니면 권한이있는 다른 개체입니까? 즉. Read1은 객체 유형 XXX, YYY의 Read2 및 Read3 ... 등에서 읽 힙니다. – Igor

+0

이 구조는 주로 설명을위한 것입니다. 실제 사용 권한은 Read1..3이 개체 xxx 및 Write1..3이 개체 YYY – gilmishal

+2

에 대한 것과 같이 다른 리소스에 대한 권한 수준을 규제합니다. 그런 다음 구조를 변경해야합니다. 유형 인 경우에는 PermissionFlags','ObjectType' (관계형 데이터베이스의 테이블과 동일, 2 열)의 두 가지 특성이 있습니다. ObjectType은 권한이 적용되는 것입니다. 최대한 포괄적 인 권한을 유지하십시오. 난 당신이 컴파일 타임에 권한의 불법 조합을 잡을 수 있도록 솔루션을 의심, 당신은 런타임 유효성 검사를 만들거나 데이터베이스에 유효성 검사 논리를 추가해야 할 것입니다. – Igor

답변

1

db는 int보다 큰 데이터를 저장할 필요가 없습니다. 32 비트는 고유 한 비트 플래그에 더 많은 값을 수용 할 수 있습니다. 다음 16 진수 값은 고유 한 이진 비트 플래그입니다. Read1 | Read2Read3

[Flags] 
public enum Permission 
{ 
    Read1 = 0x00000001, 
    Read2 = 0x00000002, 
    Read3 = 0x00000004, 

    Write1 = 0x00000008, 
    Write2 = 0x00000010, 
    Write3 = 0x00000020, 

    Update1 = 0x00000040, 
    Update2 = 0x00000080, 
    Update3 = 0x00000100, 

    Destory = 0x00000400, 

    Other = 0x00000800, 

    SomethingElse = 0x00001000, 

} 

동일한 당신은 아마 쓰기, 읽기와 같은 특정 비트 블록을 차단하여 등 일예이 더 나은를 구성 할 수 없습니다 첫 번째 8 비트에 대해 읽기를 차단하고 다음 8 비트에 대해 쓰기 등을 차단할 수 있습니다. 그렇게하면 향후 변경 사항을 수용 할 수 있고 비트 마스킹을 효과적으로 사용할 수 있습니다.

+0

그렇지만 특정 유형의 권한 유형으로 제한됩니다.이 시스템은 새로운 시스템이므로이를 그대로 유지할 수 없습니다. 필자는 작업 당 10 개 이상의 사용 권한이 없다고 가정 할 수 있으며 각 사용자는 하나의 작업 만 필요합니다. 16 비트 정수 이상을 사용하면 낭비가됩니다. 32 비트 정수로 처리 할 수도 있습니다. – gilmishal

관련 문제