【问题标题】:Using Enum Flags How to?使用枚举标志如何?
【发布时间】:2012-09-23 01:45:12
【问题描述】:

目前我的网站有 4 个权限

Edit
Delete
Add
View

当有人订阅其他人时,每个人都会获得查看权限。

目前,我将每个列作为位值存储在我的数据库中。

我在想也许我应该将枚举与标志一起使用,但我有一些问题。

  1. 用户将能够选择用户权限(每个人都可以查看您无法取消的权限)。现在很容易,因为我使用了一个复选框,然后将 bool 值保存到数据库中。

我的问题是将复选框转换为枚举类型的最佳方法是什么?因此,如果他们选择添加权限,我可以将其映射到正确的枚举类型。

想知道有没有更好的办法

PermissionTypes t;
if(add == true)
{
   t = PermissionTypes.Add
}

if(edit == true)
{
   t += PermissionTypes.Edit // not sure if you even can do this.
}

我知道使用枚举标志你可以使用管道并执行类似的操作

PermissionTypes t = PermissionTypes.Add | PermissionTypes.Edit

我想知道在我的枚举中使用另一种类型是否是一种好习惯

AddEdit = Add | Edit

我认为这可能会导致许多组合(想象一下,如果我有 10 个权限或类似的权限)。

【问题讨论】:

  • 你拥有的东西是相当合理的。 | 等效于 +=|=
  • 你可以用if(add)代替if(add == true)

标签: c# asp.net-mvc enums


【解决方案1】:

枚举只是整数值。通过将枚举值设置为 2 的不同幂,您可以轻松获得所需的任何组合:

enum ePermissions
{

   None = 0,
   View = 1,
   Edit = 2,
   Delete = 4,
   Add = 8,
   All = 15
}

ePermissions t;
t = (ePermissions)((add?ePermissions.Add:ePermissions.None) | (delete?ePermissions.Delete:ePermissions.None) | ...);

如果您想知道某个用户是否具有添加权限,请执行以下操作:

canAdd = (currentPermission & ePermissions.Add) != 0;

【讨论】:

  • 为什么全部 = 15?本来以为是 16(我知道另一个加起来是 15),因为那是 2 的幂。
  • 全部 = 查看 |编辑 |删除 | Add = 15。这不是每次看到的总和,而是按位或。基本上,如果我们在二进制代码中查看它,这将是:1111,每个操作 1 位。
  • 更直观的是使用All = View | Edit | Delete | Add
【解决方案2】:

在将 bool 值集转换为枚举时 - 对于小型集 if 就可以了。您也可以使用?: 运算符在较少的行数中执行相同的操作:

[Flags]
enum Permissions 
{ 
   None = 0, 
   View = 1, 
   Edit = 2, 
   Delete = 4, 
   Add = 8, 
}

var permissions = 
  (add ? Permissions.Add : Permissions.None) |
  (edit ? Permissions.Edit : Permissions.None) |
  (delete ? Permissions.Delete : Permissions.None);

如果您有大量值,则将 Control 映射到 Enum 可能会有用。

打开AddEdit - 这个特殊的打开可能没用。你可以很容易地写Add | Edit。如果代码将以一种有意义的方式使用这种组合,则可以专门命名一些权限(或 falgs)的有意义的组合。 IE。 CanModify = Add | View.

【讨论】:

  • 它不应该是 +(加法),而是 | (按位或)运算。虽然在这个例子中,结果是一样的。如果我们使用 +,我们需要处理一些边缘情况,例如添加两次权限。
  • @lcfseth,感谢您的评论。我更喜欢+ 的可读性(纯粹是个人喜好),但我同意一般情况下| 更安全。根据您的建议更改样本。
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多