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)
}