王朝网络
分享
 
 
 

一个关于复合型枚举标志位的功能类

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

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

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

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

面这个类就以颜色为例子提供了相应的操作,大家有好的想法可以一起来探讨。

-----------------------

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(',') == -1) return 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 == 0) return 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;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有