您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關C#中FlagsAttribute屬性如何在enum中的使用 ,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
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,Flag3,這樣做的意義在于我們可以實現“或”的關系。
就上例而言,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中的使用 有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。