C#中FlagsAttribute屬性在enum中的應用詳解
Net C#中枚舉的聲明格式如下所示:
[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]
FlagsAttribute屬性就是枚舉類型的一項可選屬性。它的主要作用是可以將枚舉作為位域處理(P.S. C#不支持位域)。
所謂位域 是單個存儲單元內(nèi)相鄰二進制位的集合。
通過為枚舉添加這個屬性,可以改變枚舉的一些行為來滿足我們的需要。
enum MyFlags { Flag1, Flag2, Flag3, Flag4}; MyFlags myFlag = MyFlags.Flag2 | MyFlags.Flag3; Console.WriteLine(myFlag);//Flag4
因為對于整數(shù)來說,| 操作就是將其轉(zhuǎn)化為二進制再進行或運算。Flags.Flag2 | Flags.Flag3做的工作實際上是 0001 | 0010 = 0011 = 3再轉(zhuǎn)換成(MyFlags)3就是Flag4了
如果枚舉聲明如下:
[FlagsAttribute] enum MyFlags{ Flag1 = 0, //000 Flag2 = 1, //001 Flag3 = 2, //010 Flag4 = 4 //100 };
則上述結(jié)果為Flag2,Flag3,這樣做的意義在于我們可以實現(xiàn)“或”的關(guān)系。
就上例而言,myFlag可以更直觀的表現(xiàn)為011,因此當我們想要檢驗它滿足哪個枚舉值時我們可以使用&操作:
if((myFlag & MyFlags.Flag2) == MyFlags.Flag2) { Console.WriteLine("true"); } if((myFlag & MyFlags.Flag3) == MyFlags.Flag3) { Console.WriteLine("true"); }
011&001 = 001,011&010 = 010,因此這兩個if都會成立,這就是這種枚舉的意義吧。另外我們應當注意默認初始化的myFlag的值為0,與其作&運算不會有任何結(jié)果。
補充知識:C# 使用特性(Attribute)來漢化枚舉類
一、新建枚舉
public enum CRUD { Create, Retrieve, Update, Delete }
二、新建特性類
public sealed class ChineseAttribute : Attribute { public string Chinese { get; set; } public ChineseAttribute(string _chinese = "未漢化") { Chinese = _chinese; } }
三、利用反射獲取特性
這里我們寫一個枚舉類的擴展方法
public static string GetChinese(this Enum value) { Type objType = value.GetType(); Type attrType = typeof(ChineseAttribute); FieldInfo field = objType.GetField(value.ToString()); //利用反射找是否有【Chinese】特性 if (field.IsDefined(attrType)) { var chinese = field.GetCustomAttribute<ChineseAttribute>(); return chinese.Chinese; } //沒有定義Chinese特性,直接返回具體指 return value.ToString(); }
四、給枚舉類添加特性
public enum CRUD { [Chinese("創(chuàng)建")] Create, [Chinese("讀取")] Retrieve, [Chinese] Update, Delete }
五、測試
static void Main(string[] args) { List<MyEnum.CRUD> values = new List<MyEnum.CRUD> { MyEnum.CRUD.Create, MyEnum.CRUD.Delete, MyEnum.CRUD.Retrieve, MyEnum.CRUD.Update }; foreach (var item in values) { Console.WriteLine(item.GetChinese()); } Console.Read(); }
效果如下
以上這篇C#中FlagsAttribute屬性在enum中的應用詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#/VB.NET 實現(xiàn)在PDF表格中添加條形碼
條碼的應用已深入生活和工作的方方面面。在處理條碼時,常需要和各種文檔格式相結(jié)合。本文,以操作PDF文件為例,介紹如何在編輯表格時,向單元格中插入條形碼,需要的可以參考一下2022-06-06Unity的IPostprocessBuild實用案例深入解析
這篇文章主要為大家介紹了Unity的IPostprocessBuild實用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05C# 使用AspriseOCR.dll實現(xiàn)驗證碼識別
這篇文章主要介紹了C# 使用AspriseOCR.dll實現(xiàn)驗證碼識別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03