日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样)

發(fā)布時(shí)間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

回到目錄

如果您看到這個(gè)題目,覺得有點(diǎn)怪,那說明你是一個(gè)高人,最起碼比我高的多,呵呵。

前幾天做了一個(gè)公用后臺管理系統(tǒng)的項(xiàng)目,其中有一個(gè)地方涉及到權(quán)限管理的,即為每一個(gè)按鈕賦一個(gè)權(quán)限,然后它權(quán)限匯總到角色表里,即一種角色有一些操作權(quán)限
,表結(jié)構(gòu)如下:

我們看到OperatorAuthority就是操作權(quán)限的意思,它是個(gè)int類型的,一個(gè)role有一個(gè)OperatorAuthority,那我們應(yīng)該怎么把多個(gè)權(quán)限存儲到OperatorAuthority字段里呢?

這時(shí),我想到了枚舉類型的位運(yùn)算,所以我把權(quán)限枚舉設(shè)計(jì)成了這樣:

1 [Flags] 2 public enum UserOperatorRole 3 { 4 #region 通用操作權(quán)限 5 6 /// <summary> 7 /// 沒有任何操作權(quán)限 8 /// </summary> 9 [Description("沒有權(quán)限")] 10 NoneAny = 1, 11 /// <summary> 12 /// 查看事件 13 /// </summary> 14 [Description("查看事件")] 15 ReadEvent = 2, 16 /// <summary> 17 /// 添加事件 18 /// </summary> 19 [Description("添加事件")] 20 AddEvent = 4, 21 /// <summary> 22 /// 修改事件 23 /// </summary> 24 [Description("修改事件")] 25 ModifyEvent = 8, 26 /// <summary> 27 /// 刪除事件 28 /// </summary> 29 [Description("刪除事件")] 30 DeleteEvent = 16, 31 /// <summary> 32 /// 審批 33 /// </summary> 34 [Description("審批")] 35 ApproveEvent = 32 36 37 #endregion 38 39 40 41 42 }

然后在存儲時(shí),使用枚舉的位運(yùn)算,對它進(jìn)行求和即可,如查看事和修改事件的結(jié)果被存儲為10,即它只能是2和8相加的結(jié)果,如果希望了解更多位運(yùn)算,可以查看我的這篇文章

這樣的設(shè)計(jì),對于單個(gè)項(xiàng)目是沒有任何問題的,如果希望添加一種新的功能,如“訂閱”,我們只要修改這個(gè)枚舉類,再為它添加一種訂閱的邏輯即可。(當(dāng)然,這不符合開閉原則了)

但我設(shè)計(jì)的偏偏是一個(gè)“通用的系統(tǒng)”,即可能會有多個(gè)不同的項(xiàng)目去引用這個(gè)系統(tǒng),這個(gè)系統(tǒng)相當(dāng)于一個(gè)底層的核心系統(tǒng),這時(shí)問題就來了,系統(tǒng)A的權(quán)限需要添加一個(gè)“撤單”權(quán)限,而系統(tǒng)B需要有一個(gè)“發(fā)布產(chǎn)品”及“管理產(chǎn)品”的權(quán)限,這下子我也完蛋了,這種需求被不斷的添加進(jìn)來,我可怎么辦呀!

主角登場了,整形也來個(gè)們運(yùn)算吧,首先我把所有公用權(quán)限進(jìn)行統(tǒng)計(jì),放在一張表里,如果其它系統(tǒng)有新需求,在它的權(quán)限表里繼續(xù)添加即可,表結(jié)構(gòu)如下:

這樣的設(shè)計(jì),我認(rèn)為完成了,但對于一個(gè)int32類型來說,它是否也可以支持按位計(jì)算呢?我又一想,枚舉類型本來就是繼承int,short,long,byte等整形類型的,所以,我認(rèn)識int32也完全可以支持位運(yùn)算,結(jié)果我的測試表明我的想法是正確的,呵呵。

這時(shí),我們通用按鈕的建立,就變成了這樣,接收一個(gè)Enum這個(gè)枚舉類型的統(tǒng)一基類,這樣不管A系統(tǒng)和B系統(tǒng)自定義什么樣的枚舉,我都通通接受,呵呵。

1 /// <summary> 2 /// 按鈕對象,只產(chǎn)生按鈕,對按鈕的click等事件需要在具體頁面自己添加 3 /// </summary> 4 /// <param name="html"></param> 5 /// <param name="buttonName">按鈕ID</param> 6 /// <param name="displayName">按鈕顯示名稱</param> 7 /// <param name="userOperatorRole">按鈕權(quán)限</param> 8 /// <param name="buttonType">按鈕類型</param> 9 /// <returns></returns> 10 public static MvcHtmlString CreateButton(this HtmlHelper html, string buttonName, string displayName, Enum userOperatorRole, ButtonType buttonType) 11 { 12 var tag = new TagBuilder("input"); 13 tag.AddCssClass("button"); 14 tag.Attributes["Name"] = buttonName; 15 tag.Attributes["ID"] = buttonName; 16 tag.Attributes["Value"] = displayName; 17 tag.Attributes["Type"] = buttonType.ToString(); 18 if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0) 19 { 20 tag.Attributes["disabled"] = "disabled"; 21 tag.AddCssClass("button gray"); 22 } 23 return MvcHtmlString.Create(tag.ToString()); 24 }

程序員在開發(fā)時(shí),枚舉類型起到了直觀,準(zhǔn)確和可讀性強(qiáng)的優(yōu)點(diǎn),所以,對于一些固定的少限的元素集可以采用枚舉類型和存儲。

小知識:Enum是枚舉類型的基類

?????????? Delegate是委托類型的基類

回到目錄

轉(zhuǎn)載于:https://www.cnblogs.com/lori/archive/2012/06/08/2541399.html

總結(jié)

以上是生活随笔為你收集整理的将不确定变为确定~整形变量是否可以进行位运算(像枚举类型一样)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。