2012-09-23 56 views
0

目前,我有我的网站使用枚举标志如何?

Edit 
Delete 
Add 
View 

每个人都会查看权限时,有人订阅别人4个权限。

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

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

  1. 用户将能够选择用户权限(eveyone获取视图,你不能拿走它)。现在很容易,因为我使用复选框,然后将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 

我在想这会导致许多组合tions(想象一下,如果我有10个权限或类似的东西)。

+0

你有什么是相当合理的。 '+ ='的'|'等价于'| ='。 – siride

+1

你可以使用'if(add)'而不是'if(add == true)'。 – nneonneo

回答

2

枚举值只是整数值。通过设置您的枚举值不同功率的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; 
+0

为什么全部= 15?本来以为它会是16(我知道其他加起来就是15),因为那是2的幂。 – chobo2

+0

全部=查看|编辑|删除|添加= 15.它不是每个看到的总和,而是一个按位或。基本上,如果我们用二进制代码来看它,这将是:1111,每个操作1位。 –

+0

更明显的是使用'All = View |编辑|删除| Add'。 – 2012-09-23 16:30:36

0

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

如果你有大量的值的某种控制映射到枚举的可能是有用的。

AddEdit - 这个特殊的可能没有用。你可以轻松地写Add | Edit。如果代码以平均值方式使用这种组合,可能会特别命名一些权限(或谬误)的menaingful组合。即CanModify = Add | View

+0

它不应该是+(另外),而是| (按位或)操作。虽然在这个例子中,结果是一样的。如果我们使用+,我们需要处理一些边缘情况,例如两次添加权限。 –

+0

@lcfseth,感谢您的评论。我更喜欢'+'来代表可读性(纯粹是个人偏好),但我同意在一般情况下''更安全。根据你的推荐改变样本。 –