简要介绍C#位域(flags)的相关知识

   C#位域主要用于.net里面对于某一个事物有多种混合状态时使用,单一的枚举更的在事物只具有单一属性时使用。为了更好的实现混合状态,我们可以在枚举加上C#位域标签。下面的这个就是我们在本文中用到的实例:

 

  

代码
[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  

 

 

 

 

位域支持的运算符

1. “|”:表示两边求并集(元素相加,相同元素只出现一次)

 

Week week = Week.Tuesday | Week.Monday | Week.Monday;  
MessageBox.Show(Convert.ToString(week)); 

 

 

 

这段代码的结果就是 Monday,Tuesday

2. “&”:表示两边是否其中一个是另外一个的子集,如果是返回子集,否则返回0(如果其中一个包含另外一个,返回被包含的,否则返回0)

 

week = Week.Monday & week; 
 MessageBox.Show(week.ToString());
与week 
= week & Week.Monday;  
MessageBox.Show(week.ToString()); 

 

 

上面这两段代码的结果是相同的,如果week的初始值为:Monday,Tuesday,返回的结果为:Monday

3.“^”:表示从两者的并集中去除两者的交集(把两个的元素合并到一起,如果两个中有公共元素,要将这个公共元素从合并的结果中去除)

 

 

代码
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()); 

 

 

上面两个返回的结果应该为:Tuesday,Wednesday 和 Monday,Tuesday,Wednesday,Sunday

4.“~”:表示取反,返回的结果我还不知道应该是什么,以后再查一下。用法主要和“&”一起使用,例如:去除其中的某个元素

 

 

week = Week.Tuesday | Week.Monday | Week.Wednesday;  
week 
= week &(~Week.Monday);  
MessageBox.Show(week.ToString()); 

 

 

上面返回的结果为:Tuesday,Wednesday

正逆转化

上面的内容存在数据库时我们可能为了简单只存取数字即可,例如:1表示Monday,3表示Monday,Tuesday。我们可以根据数据库里面的值方便获取存储的内容,代码如下:

 

 

week = Week.Monday  | Week.Tuesday; 
 MessageBox.Show(Convert.ToString((
int)week)); 
 week 
= (Week)Enum.Parse(typeof(Week), "10"); 
 MessageBox.Show(week.ToString()); 

 

 

返回的结果为:3 和 Tuesday,Tursday

获取Description标签内容

我们既然可以给里面的值加上Description,就可以在程序中获取到这个内容,至于用途,大家自己看吧,东西摆出来,大家自己随便怎么用,下面的代码是从网上找到的,内容如下:

 

 

代码
/// < summary> 
/// 从枚举类型和它的特性读出并返回一个键值对 
/// < /summary>  
/// < param name="enumType">Type,该参数的格式为typeof(需要读的枚举类型)< /param>  
/// < returns>键值对< /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, nullnullnull)).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; 

 

 

 

posted @ 2010-05-19 10:19  唔愛吃蘋果  阅读(1035)  评论(0编辑  收藏  举报