簡(jiǎn)要介紹C#位域(flags)的相關(guān)知識(shí)
C#位域主要用于.net里面對(duì)于某一個(gè)事物有多種混合狀態(tài)時(shí)使用,單一的枚舉更的在事物只具有單一屬性時(shí)使用。為了更好的實(shí)現(xiàn)混合狀態(tài),我們可以在枚舉加上C#位域標(biāo)簽。下面的這個(gè)就是我們?cè)诒疚闹杏玫降膶?shí)例:
- [Flags]
- public enum Week
- {
- [Description("星期一")]
- Monday = 1 < < 0,
- [Description("星期二")]
- Tuesday = 1 < < 1,
- [Description("星期三")]
- Wednesday = 1 < < 2,
- [Description("星期四")]
- Tursday = 1 < < 3,
- [Description("星期五")]
- Friday = 1 < < 4,
- [Description("星期六")]
- Saturday = 1 < < 5,
- [Description("星期日")]
- Sunday = 1 < < 6
- }
位域支持的運(yùn)算符
1. “|”:表示兩邊求并集(元素相加,相同元素只出現(xiàn)一次)
- Week week = Week.Tuesday | Week.Monday | Week.Monday;
- MessageBox.Show(Convert.ToString(week));
這段代碼的結(jié)果就是 Monday,Tuesday
2. “&”:表示兩邊是否其中一個(gè)是另外一個(gè)的子集,如果是返回子集,否則返回0(如果其中一個(gè)包含另外一個(gè),返回被包含的,否則返回0)
- week = Week.Monday & week;
- MessageBox.Show(week.ToString());與week = week & Week.Monday;
- MessageBox.Show(week.ToString());
上面這兩段代碼的結(jié)果是相同的,如果week的初始值為:Monday,Tuesday,返回的結(jié)果為:Monday
3.“^”:表示從兩者的并集中去除兩者的交集(把兩個(gè)的元素合并到一起,如果兩個(gè)中有公共元素,要將這個(gè)公共元素從合并的結(jié)果中去除)
- week = (Week.Monday | Week.Wednesday)^ (Week.Tuesday | Week.Monday);
- MessageBox.Show(week.ToString());
- week = (Week.Monday | Week.Wednesday) ^ (Week.Tuesday | Week.Sunday);
- MessageBox.Show(week.ToString());
上面兩個(gè)返回的結(jié)果應(yīng)該為:Tuesday,Wednesday 和 Monday,Tuesday,Wednesday,Sunday
4.“~”:表示取反,返回的結(jié)果我還不知道應(yīng)該是什么,以后再查一下。用法主要和“&”一起使用,例如:去除其中的某個(gè)元素
- week = Week.Tuesday | Week.Monday | Week.Wednesday;
- week = week &(~Week.Monday);
- MessageBox.Show(week.ToString());
上面返回的結(jié)果為:Tuesday,Wednesday
正逆轉(zhuǎn)化
上面的內(nèi)容存在數(shù)據(jù)庫(kù)時(shí)我們可能為了簡(jiǎn)單只存取數(shù)字即可,例如:1表示Monday,3表示Monday,Tuesday。我們可以根據(jù)數(shù)據(jù)庫(kù)里面的值方便獲取存儲(chǔ)的內(nèi)容,代碼如下:
- week = Week.Monday | Week.Tuesday;
- MessageBox.Show(Convert.ToString((int)week));
- week = (Week)Enum.Parse(typeof(Week), "10");
- MessageBox.Show(week.ToString());
返回的結(jié)果為:3 和 Tuesday,Tursday
獲取Description標(biāo)簽內(nèi)容
我們既然可以給里面的值加上Description,就可以在程序中獲取到這個(gè)內(nèi)容,至于用途,大家自己看吧,東西擺出來(lái),大家自己隨便怎么用,下面的代碼是從網(wǎng)上找到的,內(nèi)容如下:
- /// < summary>
- /// 從枚舉類(lèi)型和它的特性讀出并返回一個(gè)鍵值對(duì)
- /// < /summary>
- /// < param name="enumType">Type,該參數(shù)的格式為typeof(需要讀的枚舉類(lèi)型)< /param>
- /// < returns>鍵值對(duì)< /returns>
- public static NameValueCollection GetNVCFromEnumValue(Type enumType)
- {
- NameValueCollection nvc = new NameValueCollection();
- Type typeDescription = typeof(DescriptionAttribute);
- System.Reflection.FieldInfo[] fields = enumType.GetFields();
- string strText = string.Empty;
- string strValue = string.Empty;
- foreach (FieldInfo field in fields)
- {
- if (field.FieldType.IsEnum)
- {
- strValue = ((int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null)).ToString();
- object[] arr = field.GetCustomAttributes(typeDescription, true);
- if (arr.Length > 0)
- {
- DescriptionAttribute aa = (DescriptionAttribute)arr[0];
- strText = aa.Description;
- }
- else
- {
- strText = field.Name;
- }
- nvc.Add(strText, strValue);
- }
- }
- return nvc;
- }
C#位域(flags)的相關(guān)知識(shí)就介紹到這里。
【編輯推薦】