C#中FlagsAttribute屬性在enum中的應用詳解
阿新 • • 發佈:2020-10-22
Net C#中列舉的宣告格式如下所示:
[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]
FlagsAttribute屬性就是列舉型別的一項可選屬性。它的主要作用是可以將列舉作為位域處理(P.S. C#不支援位域)。
所謂位域 是單個儲存單元內相鄰二進位制位的集合。
通過為列舉新增這個屬性,可以改變列舉的一些行為來滿足我們的需要。
enum MyFlags { Flag1,Flag2,Flag3,Flag4}; MyFlags myFlag = MyFlags.Flag2 | MyFlags.Flag3; Console.WriteLine(myFlag);//Flag4
因為對於整數來說,| 操作就是將其轉化為二進位制再進行或運算。Flags.Flag2 | Flags.Flag3做的工作實際上是 0001 | 0010 = 0011 = 3再轉換成(MyFlags)3就是Flag4了
如果列舉宣告如下:
[FlagsAttribute] enum MyFlags{ Flag1 = 0,//000 Flag2 = 1,//001 Flag3 = 2,//010 Flag4 = 4 //100 };
則上述結果為Flag2,這樣做的意義在於我們可以實現“或”的關係。
就上例而言,myFlag可以更直觀的表現為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,與其作&運算不會有任何結果。
補充知識: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("建立")] 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中的應用詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。