位枚举的学习
枚举在开发中是很有用的,就以位枚举在权限设计中为例.
1.定义一个enum
加[Flags]的标记,表示是位枚举,同时枚举中的值还必须是2的幂.
[Flags]//位枚举的Attribute enum Roles//值必须为2的幂 { //none=0, admin = 1, user = 2, guest = 4 //all=admin|user|guest//所有 }
2.使用以下两个方法可以获取枚举中的值和名称,
当然你可以将它们作为datasource绑定到前台的checkBoxList,dropDownList
int[]intRoles = Enum.GetValues(typeof(Roles))//获取该枚举所有项的值 string[]strRoles = Enum.GetNames(typeof(Role))//获取该枚举所有项的名称
3.对枚举进行操作
|是位或操作,&是位与操作,^是位或操作;
代码:
Roles role = (Roles)3;//将int值转换为枚举 role = role | Roles.admin | Roles.user;//通过位或操作为该角色添加权限 role = role ^ Role.admin;//通过位非操作删除admin权限 int intRole = Convert.ToInt32(roles);//将枚举转为int值,可以存入数据库 List<Roles> roles = GetEnum(role);//从数据库中取出int值,将其转换出Roles的list表 /// <summary> /// 获取角色列表list /// </summary> /// <param name="role"></param> /// <returns></returns> public static List<Roles> GetEnum(Roles role) { List<Roles> roles = new List<Roles>(); foreach (int i in Enum.GetValues(typeof(Roles))) { if ((role & (Roles)i) != 0) { roles.Add((Roles)i); } } return roles; }
注:本来想将GetEnum方法写成泛型版本,奈何system.Enum不能用于泛型约束!