C#枚举标志-角色编辑、查看、管理

C#枚举标志-角色编辑、查看、管理,c#,enums,bitwise-operators,bitflags,C#,Enums,Bitwise Operators,Bitflags,我这样定义我的角色: [Flags] public enum Roles : byte { View = 1, Edit = 2, Admin = (View | Edit) } 查看角色,只能查看 编辑只能查看和编辑 管理员可以做管理员的工作,编辑和查看 我在定义枚举时是否做错了什么?管理员定义仅在您希望分离角色并使用admin对其进行分组时有效。只需将枚举改写为英语: View is equal View and nothi

我这样定义我的角色:

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

我在定义枚举时是否做错了什么?

管理员定义仅在您希望分离角色并使用admin对其进行分组时有效。只需将枚举改写为英语:

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

如果你想角色回退(像admin ->Edg->View),你必须把它看作是独一无二的角色(甚至是管理员),并使用命令来指定角色是如何重要的:

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

这看起来不错,但对于标志,您必须记住不能按1(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
}
您可以看到,您可以检测像这样设置的单个标志(特别是管理标志)

您可以看到这项工作:

我也喜欢这种可读性定义(如果我以后想添加一个,就不必计算数学)

[标志]
公共枚举角色:字节
{

View=1您遇到了什么问题?您有实际问题吗?除了
Admin
Edit
View
的组合不同之外?我想区分Admin和Edit,但我不知道如何区分。因为Admin现在是View | Edit,但Edit也是Edit | View,所以对此我有点困惑.就像我说的,
Admin
是它自己的角色,它不是
View
Edit
的总和,所以你不能这样做。那么,我如何将此位掩码与角色值进行比较?
Roles role = Roles.Admin;
bool canView = ((role & Roles.View) == Roles.View);
bool canEdit = ((role & Roles.Edit) == Roles.Edit);
bool isAdmin = (role == Roles.Admin);
[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)
}