gpt4 book ai didi

c# - 在 C# 中定义权限集的枚举

转载 作者:太空狗 更新时间:2023-10-29 18:16:37 24 4
gpt4 key购买 nike

我们正在重新考虑将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com