C#Enum Flags - 角色编辑,查看,管理员

时间:2015-07-02 15:42:34

标签: c# enums bitwise-operators bitflags

我定义了这样的角色:

[Flags]
public enum Roles : byte
{        
    View = 1,       
    Edit = 2,    
    Admin = (View | Edit)
}
  • 查看角色,只能查看
  • 编辑只能查看和编辑
  • 管理员可以执行管理员工作,编辑和查看

我在定义我的枚举时做错了吗?

2 个答案:

答案 0 :(得分:2)

看起来很好,但对于旗帜,你必须记住你不能增加(1,2,3,4) - 它必须像:1,2,4,8那样。

使用枚举定义:

[Flags]
public enum Roles : byte
{
    View = 1,
    Edit = 2,
    Admin = (View | Edit) // Good for code readability - and if the values change
}

您可以看到您可以检测到这样设置的各个标志(甚至特别是Admin one)。

Roles role = Roles.Admin;
bool canView = ((role & Roles.View) == Roles.View);
bool canEdit = ((role & Roles.Edit) == Roles.Edit);
bool isAdmin = (role == Roles.Admin);

您可以看到这项工作:https://dotnetfiddle.net/0pm4jW

我也喜欢这种可读性定义(如果我想稍后添加一个,则无需计算数学。)

[Flags]
public enum Roles : byte
{
    View   = 1 << 0, // 1
    Edit   = 1 << 1, // 2
    Delete = 1 << 2, // 4
    Share  = 1 << 3, // 8
    Admin = (View | Edit | Delete | Share)
}

答案 1 :(得分:0)

管理员定义仅在您想要分隔角色并使用管理员对其进行分组时才有效。只需将你的枚举重写为英文:

View is equal View and nothing more
Edit is equal Edit and nothing more
Admin is equal Admin or Edit or View

如果您想要角色回退(例如Admin - &gt; Edit - &gt; View),您必须将其视为唯一角色(甚至是管理员),并使用order来指定角色的重要性:

public enum Roles // note there is no flag attribute
{        
    View = 1,       
    Edit = 2,    
    Admin = 3
}

如何测试角色?只需创建简单的功能:

bool isInRole(Roles currentRole, Roles expectedRole)
{
    return currentRole >= expectedRole;
}

isInRole(Roles.Admin, Roles.Admin); // true
isInRole(Roles.Edit, Roles.Admin); // false
isInRole(Roles.Edit, Roles.Edit); // true
isInRole(Roles.Edit, Roles.View); // true