我们经常需要设置这样一些标志位:比如对于模块我们分浏览、审核、修改、删除、冻结等不同的

权限,可能还有无权限和完全权限,这些权限可叠加,可能还要分级别。对于每个模块我们都要设

置一个用户对此模块的相关权限,所以就不可避免地要对这些标志位进行绑定、显示、修改等。下

面这个类就以颜色为例子提供了相应的操作,大家有好的想法可以一起来探讨。
-----------------------
public class ColorType
 {
  
//枚举所有标志,最小项应该为0,
  
//最大项为前面数值的总和,这样最大项就包括前面所有的组合
  [Flags]  
  
public enum enumColorType 
  { 
   Transparent
=0,
   Yellow 
= 1
   Red 
= 2
   Blue 
= 4,
   AllColor
=7
  }
  
public const string TRANSPARENT = "透明"
  
public const string YELLOW = "黄色"
  
public const string RED = "红色"
  
public const string BLUE = "蓝色"
  
public const string ALLCOLOR = "全色"

  
private static System.Collections.Specialized.ListDictionary _lstDicItem; 
  
  
//显示数据和单选情况下所用的数据源
  public static IDictionary dicSingleOrViewColor
  { 
   
get 
   { 
    
if (_lstDicItem == null
    { 
     
//由于枚举的项目较少,所以使用了ListDictionary;
     
//如果项目较多且需要排序,可以使用SortedList
     _lstDicItem = new System.Collections.Specialized.ListDictionary(); 

     
foreach (Int32 nConstValue in System.Enum.GetValues(typeof(enumColorType))) 
     { 
      
//使用String类型做为KEY可减少拆装箱
      _lstDicItem.Add(nConstValue.ToString(), typeof(ColorType).GetField(Enum.ToObject(typeof(enumColorType),nConstValue).ToString().ToUpper()).GetValue(null)); 
     } 
    } 
    
return _lstDicItem;
   } 
  }
  
//复选情况下所用的数据源,您也可以声明另一个静态变量来存储它
  public static IDictionary dicMultipleColor
  { 
   
get 
   { 
    
//不包含第一和最后一项。比如CheckBoxList,用户不选就是第一项,全选就是最后一项
    System.Collections.Specialized.ListDictionary _lstDicItemCopied = new System.Collections.Specialized.ListDictionary();
    
foreach (DictionaryEntry DicEntry in _lstDicItem)
    {
     
if (DicEntry.Key.ToString() == enumColorType.AllColor.ToString() || DicEntry.Key.ToString() == enumColorType.Transparent.ToString()) continue;
     _lstDicItemCopied.Add(DicEntry.Key,DicEntry.Value);
    }
    
return _lstDicItemCopied;
   } 
  }
  
//把Key或者Value解析成相应的值
  public static Int32 ParseValue(string strKeyOrValue) 
  { 
   
int nSumTotal = 0;
   
if(Char.IsDigit(strKeyOrValue[0]))
   {
    
if (strKeyOrValue.IndexOf(','== -1return Int32.Parse(strKeyOrValue);
    
foreach (string strOneValue in strKeyOrValue.Split(','))
    {
     nSumTotal 
+= Int32.Parse(strOneValue);
    }    
   }
   
else
   {
    nSumTotal 
= Convert.ToInt32((enumColorType)(System.Enum.Parse(typeof(enumColorType), strKeyOrValue,true)));
   }
   
   
return nSumTotal;
  } 
  
//把Key或者Value解析成相应的汉字说明
  public static string ParseValueWord(string strKeyOrValue,bool boolParsed) 
  {        
   
if (strKeyOrValue.IndexOf(","> -1
   { 
    
if (!boolParsed)
    {
     
int nParsedValue = ParseValue(strKeyOrValue);
     
if (dicSingleOrViewColor.Contains(nParsedValue.ToString()))
     {
      
return dicSingleOrViewColor[nParsedValue.ToString()].ToString(); 
     }
    }
    
string strComboWords = ""
    
string[] strSepWords = strKeyOrValue.Split(','); 
    
foreach (string strOneWord in strSepWords) 
    { 
     
if (strComboWords.Length > 0
     { 
      strComboWords 
+= "";
     } 
     
if (Char.IsDigit(strOneWord[0])) 
     {
      strComboWords 
+= dicSingleOrViewColor[strOneWord].ToString(); 
     }    
     
else 
     {
      
object obj = System.Enum.Parse(typeof(enumColorType), strOneWord,true);
      strComboWords 
+= dicSingleOrViewColor[((Int32)((enumColorType)obj)).ToString()].ToString();     
     }
    }     
    
return strComboWords; 
   } 
   
else 
   { 
    enumColorType enumParsedColor 
=(enumColorType)(System.Enum.Parse(typeof(enumColorType), strKeyOrValue,true));
    
    
if (enumParsedColor.ToString().IndexOf(","> -1
    { 
     
return ParseValueWord(enumParsedColor.ToString(),true); 
    } 
    
else 
    { 
     
return dicSingleOrViewColor[((Int32)enumParsedColor).ToString()].ToString(); 
    } 
   }    
  }
  
public static string ParseValueWord(string strKeyOrValue) 
  {
   
return ParseValueWord(strKeyOrValue,false);
  }
  
//判断总值中是否包括某一个值,也可循环调用此函数对一组CheckBox打勾
  public static bool isContained(Int32 nTotalValue,Int32 nOneColor)
  {
   
if(nTotalValue == nOneColor) return true;
   
if(nTotalValue < nOneColor) return false;
   
//什么值都包括0,所以要特殊处理
   if(nOneColor == 0return false;   
   
return ((nTotalValue & nOneColor) == nOneColor);
  }
  
public static bool isContained(Int32 nTotalValue,enumColorType oneColor)
  {
   
return (isContained(nTotalValue,(Int32)oneColor));
  }
  
//找到值最大的枚举项
  public static enumColorType GetMaxItem(Int32 nTotalValue)
  {
   Int32 nMax 
= 0;
   
//未使用SortedList,所以无法按从大到小的顺序找
   foreach (Int32 nConstValue in System.Enum.GetValues(typeof(enumColorType))) 
   { 
    
if (isContained(nTotalValue,nConstValue) && nConstValue > nMax ) nMax = nConstValue;
   } 
   
return (enumColorType)nMax;
  }
 }

相关文章: