2016-08-23 77 views
1

在C#中這是很常見找到以下枚舉結構非二進制枚舉標誌

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

,它允許你加入枚舉這樣的:Permission.Read|Permission.Create

我現在面對的是一個不同的排序要求,我提出的解決方案是有問題的國際海事組織。

我需要讓某種枚舉實現多種類型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更大的整數,不好的理由),或者每個權限有不同的枚舉(和列)(這會限制我的權限靈活性),並且沒有編譯時驗證的形式(我想我可以創建某種工作環境的運行時驗證)有沒有其他的想法?

+0

它是一種不同類型的權限,或者它是不同的權限對象?即。 Read1在對象類型XXX上讀取,在YYY上讀取2和Read3 ...等等? – Igor

+0

這個結構主要是爲了說明。實際權限調整爲不同資源的權限級別,如在Read1..3中爲對象xxx,Write1..3爲對象YYY – gilmishal

+2

然後您應該更改結構。如果它是一個類型,它將具有2個屬性:'PermissionFlags','ObjectType'(對於關係數據庫中的表,2列相同)。 ObjectType應該是權限適用的東西。儘可能保持您的權限。我懷疑是否有解決方案可以讓你在編譯時捕獲權限的非法組合,你將不得不在數據庫中創建運行時驗證和/或添加驗證邏輯。 – Igor

回答

1

你的db不需要存儲大於int的數據。 32位可以容納更多的唯一位標誌值。以下十六進制值是唯一的二進制位標誌。 Read1 | Read2將不等於Read3

[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