用于在c#中定义权限集的枚举

Dee*_*ons 8 .net c# permissions enums flags

我们不是将每个权限拆分成单独的列或sql server表,而是重新考虑使用Flag属性来Enum使用逐位操作.我们的应用程序定义端点(不是休息服务中的端点)来访问资源(读取,修改,更新),并且每个用户都有权限,例如Bob has permissions to Read, Modify resource X当bob到来并访问此资源时,我们检查bob是否具有权限x.现在我们将要应用的地方很清楚这里是我的疑惑

  • 假设Bob使用标记的枚举对资源有读,写,删除权限我会做的Permission.Read | Permission.Write | Permission.Delete是比特的结果和整数或另一个枚举?

  • 对于在数据库表中存储此权限,列应该是integer

  • 如果回答问题1 Enum那么我应该在Permissions枚举上定义另一个属性,表示Bit wise和operation的整数值吗?

disclaimer:示例中提到的Bob并不代表​​Stack溢出网络中的任何用户或任何人.这只是另一个角色

Mat*_*ley 10

按顺序回答您的问题:

  • 假设你已经设置了[Flags]属性enum,并使用正确的运算符(&|按位运算),它基本上都是.如果将结果转换为整数,则将获得按位和相关值,即.7为你的例子.如果你使用.ToString(),那么你将得到一个字符串,表明该值具有所有三个值.我相信HasFlags()某处有一种方法,但我见过的大多数代码都使用经过尝试的真正的按位代码进行比较,即:

    var x = Permissions.Read | Permissions.Write;
    if ((x & Permissions.Read) == Permissions.Read) { print "Success!"; }
    
    Run Code Online (Sandbox Code Playgroud)

    从技术角度来看,C#的类型安全有助于保持的东西理智和结果|荷兰国际集团或&荷兰国际集团2 enum相同类型的s是另一个enum同类型的,但是所有的enums为简单的整数,并且在大多数情况下被视为这样的,虽然有些事情需要明确的演员表来自/来自int.

  • 它应该是一个整体类型,是的.我相信枚举的默认类型是Int32,但是如果要完全匹配数据库和代码,则可以显式设置.

  • 鉴于上述所有情况,例如,为常用的权限集预定义值仍然很有意义ReadWrite.特别是,NoneMicrosoft建议所有枚举使用一个元素,特别是如果要构建值.这允许为新近初始化的变量提供回退和有效值,以及为其提供合理的值default(Permissions).您可以根据其他类似设置枚举值:

    [Flags]
    enum Permissions {
      None =    0,
      Read =    0x001,
      Write =   0x010,
      Execute = 0x100,
      ReadWrite = Read | Write,
      // [snip]
    }
    
    Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 5

  1. 用[Flags]标记的枚举值的按位OR/AND是相同枚举的值.
  2. 整数是合理的归档,用于在数据库中存储枚举值.
  3. 不,您不需要添加额外的枚举值,但可以为客户添加.

Normaly你用FlagsAttribute定义这样的枚举即

[Flags] enum My {
  None = 0, Read =1, Write =2, Delete = 4
};
Run Code Online (Sandbox Code Playgroud)

以这种方式定义时,您可以将不同的值与|组合 (或)操作:

My readAndWrite = My.Read | My.Write;
Run Code Online (Sandbox Code Playgroud)

按位AND将为表示唯一标志的枚举值提供0,但通常用于屏蔽其他位:

bool doIHaveWrite = (readAndWrite & My.Write) == My.Write;
Run Code Online (Sandbox Code Playgroud)

请注意,逻辑AND(&&)不能应用于枚举值.

  • +1你们两个都很好帮助我如果无论如何我可以将两者都标记为答案,Gosh现在没有这样的功能.我会赞成你 (2认同)