位枚举的学习

枚举在开发中是很有用的,就以位枚举在权限设计中为例.

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不能用于泛型约束!

  

原文地址:https://www.cnblogs.com/edwardloveyou/p/2565577.html