- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们正在重新考虑将 Flag
属性用于 Enum
以用于按位操作,而不是将每个权限拆分到单独的列或 sql server 表中。我们的应用程序定义了用于访问资源(读取、修改、更新)的端点(不是来自其他服务的端点),并且每个用户都被授予权限,例如 Bob 具有读取、修改资源 X 的权限
,所以当bob 来访问这个资源,我们检查 bob 是否有权限 x。现在我们要应用它的地方很清楚,这是我的疑问
假设 Bob 使用标记枚举对资源具有读、写、删除权限,我会执行 Permission.Read |许可。写 | Permission.Delete
按位 AND 的最终结果是一个整数还是另一个 Enum?
为了在数据库表中存储此权限,该列是否应该是一个整数
?
如果问题 1 的答案是 Enum
那么我是否应该在 Permissions
枚举上定义另一个属性来表示 Bit wise and operation 的整数值?
免责声明:
示例中提到的 Bob 不代表 Stack overflow 网站网络中的任何用户或任何人。这只是另一个角色
最佳答案
按顺序回答你的问题:
假设您已经在 enum
上设置了 [Flags]
属性,并使用了正确的运算符(&
和 |
对于按位运算)它本质上是两者兼而有之。如果将结果转换为整数,您将获得相关值的按位和,即。 7 以你为例。如果您使用 .ToString()
,那么您将得到一个字符串,表明该值具有所有三个值。我相信某处有一个 HasFlags()
方法,但我见过的大多数代码都使用久经考验的按位代码进行比较,即:
var x = Permissions.Read | Permissions.Write;
if ((x & Permissions.Read) == Permissions.Read) { print "Success!"; }
从技术的角度来看,C# 的类型安全有助于保持事物的完整性和 |
ing 或 &
ing 的两个 enum
的结果same type 是另一个相同类型的 enum
但所有 enum
都是简单的整数,在大多数情况下都可以这样对待,尽管有些东西需要显式转换到/从int
.
应该是整型的吧。我相信枚举的默认类型是 Int32
,但是如果您想精确匹配数据库和代码,您可以明确设置它。
综上所述,为常用权限集预定义值仍然很有意义,例如 ReadWrite
。特别是,Microsoft 建议对所有枚举使用 None
元素,尤其是在您要转换值时。这允许后备和新初始化变量的有效值以及 default(Permissions)
的正常值。您可以根据其他值在您的枚举中设置值,如下所示:
[Flags]
enum Permissions {
None = 0,
Read = 0x001,
Write = 0x010,
Execute = 0x100,
ReadWrite = Read | Write,
// [snip]
}
关于c# - 在 C# 中定义权限集的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10274923/
我是一名优秀的程序员,十分优秀!