列舉型別的組合

2021-06-22 14:08:23 字數 1701 閱讀 5033

列舉的『高階用法』組合運用:例如乙個介面裡有:增、刪、查、改等操作,但對應不同使用者就有不同操作許可權。例如a使用者只能增、刪,而b使用者只能查、改等等。如果在許可權表中某乙個字段型別指定使用者的操作許可權時,問題就出來了。來看看一下3種解決方式:

1.每個操作許可權一條資料,缺點:每次更改許可權時,避免不了刪除和新增,並且資料量龐大,如果乙個使用者有一千許可權就代表有一千條資料,那這張表的資料就不敢想象了。

2.乙個字段儲存所有的操作許可權,每個操作許可權使用 某個指定的符號作為分隔符,這種方式叫簡單、方便。

3.就是使用我們的列舉組合,在乙個字段儲存所有的操作許可權,但值只為乙個數,不像方式2使用分隔符分開。

當然,還有很多方式可以解決這種問題。我們現在就來看看如何使用列舉組合來代表多個操作許可權。

5.1:定義乙個操作許可權列舉:

[flags]

//必須打上乙個標記,打上這個標記系統才能識別這個列舉可使用組合方式

public

enum role

5.2:如果使用者有刪除、修改的許可權在列舉定義中只有1和2的列舉,那怎麼將這兩個列舉值組合成乙個列舉值儲存到資料庫呢?很簡單,看一下**:
int allrole = ((

int)role.刪除資料) + ((

int)role.修改資料);

//這時allrole的值為3 (兩個列舉對應值相加:1+2=3),這時直接將allrole值儲存到資料就可以了

現在我們就來判斷使用者是否具有某個操作許可權,先從資料庫中取出許可權值,以上述,allrole則為資料庫中取出的值,為3,接下來我們通過位算符來判斷:

role myallrole = (role)allrole;//

將int值強制轉換為列舉

//此時,myallrole的名稱為 『 刪除資料, 修改資料 』 ,值為3

//判斷是否有刪除許可權

if ((myallrole & role.刪除資料) == role.刪除資料)

注意此處使用了 位算符& 方式來獲取判斷,關於位算符的使用在此就不講了。組合運用大概就是這樣。必須注意的地方就是列舉值的定義,我們可以看到role列舉的定義值的規律,0到1,1到2,2到4,4到8,8到16......當前的值為上個值的2次方,為什麼要這樣定義呢?是因為任何的組合都可以在列舉範圍中某幾個值的總和,例如組合值為15,那15就等於列舉定義範圍裡的定義值為1、2、4、8相加,15=1+2+4+8。只有按規律定義值,就可以組合成任意數。

組合必須注意的幾點:

1.列舉定義時,必須打上[flags]標記,系統才會根據這個標記來決定這個列舉是否可組合使用

2.定義列舉的值必須按以上所說的規律定義,例如:0、1、2、4、8、16、32.......也可以使用3次方的方式,例如:0、3、6、12、24..........

6.使用優點總結

1.規則性:例如資料庫某個欄位的值只在1、2、3、4,例如狀態,當我們在錄入資料時,我們可以從列舉中取值,這樣避免了這個字段出現其它值,同時也使**更容易理解,因為在取值時,我們是拿列舉定義的名稱,名稱是我們自定義的易理解的中文或英文。

2.易解性:就是上述所說的,列舉名稱是用中文和英文來定義,在使用時,則拿列舉的名稱,這樣一看**就知道。而不會在**中寫1、2、3、4這樣的數字,也許過段時間自己寫的都忘了了1代表什麼?2代表什麼?了,更何況日後他人的維護呢。

使用列舉型別的值建立列舉型別

列舉型別中不僅可以宣告列舉的名稱,還可以加入附加的值如下式 public static enum pushtype public string tostring 其中push type sys稱為列舉的name,0則為列舉型別的value,那如何才能根據列舉型別的value獲取列舉型別的例項呢?見下...

列舉值的組合使用

有時候列舉只返回一項會顯得不夠用,比如新建乙個列舉型別week它總共有7項分別代表週日到周一,宣告乙個week型別的列舉值work用來表示乙個人的值日安排,這個人的值日安排可能不止一天,如果work的值只能為week7個列舉項中的乙個顯然是不夠用的。這時候就需要用到列舉的組合。想要使用列舉的組合就需...

根據列舉的型別名稱獲取列舉型別列表

前端進行搜尋或其他操作時需要獲取列舉列表,每個列舉寫乙個介面比較繁瑣,所以這裡根據列舉型別名獲取列表 以下為 示例 public class enumdto 值 public int value 描述 public string description using system.componentm...