C# 枚举标志 - 角色编辑、查看、管理
C# Enum Flags - roles edit, view, admin
我这样定义我的角色:
[Flags]
public enum Roles : byte
{
View = 1,
Edit = 2,
Admin = (View | Edit)
}
- 查看角色,只能查看
- 编辑只能查看和编辑
- 管理员可以执行管理操作、编辑和查看
我在定义枚举时做错了什么吗?
admin 定义仅在您想分离角色并使用 Admin 对它们进行分组的情况下才有效。只需将您的枚举重写为英文即可:
View is equal View and nothing more
Edit is equal Edit and nothing more
Admin is equal Admin or Edit or 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, 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
}
你可以看到你可以检测像这样设置的个人标志(甚至特别是管理员标志)。
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)
}
我这样定义我的角色:
[Flags]
public enum Roles : byte
{
View = 1,
Edit = 2,
Admin = (View | Edit)
}
- 查看角色,只能查看
- 编辑只能查看和编辑
- 管理员可以执行管理操作、编辑和查看
我在定义枚举时做错了什么吗?
admin 定义仅在您想分离角色并使用 Admin 对它们进行分组的情况下才有效。只需将您的枚举重写为英文即可:
View is equal View and nothing more
Edit is equal Edit and nothing more
Admin is equal Admin or Edit or 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, 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
}
你可以看到你可以检测像这样设置的个人标志(甚至特别是管理员标志)。
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)
}