Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中定义权限集的枚举#_C#_.net_Permissions_Enums_Flags - Fatal编程技术网

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

C# 在c中定义权限集的枚举#,c#,.net,permissions,enums,flags,C#,.net,Permissions,Enums,Flags,我们没有将每个权限拆分为单独的列或sql server表,而是重新考虑将标志属性用于枚举,以用于按位操作。我们的应用程序定义了用于访问资源(读取、修改、更新)的端点(而不是来自rest服务的端点),并且每个用户都有权限,例如Bob有读取的权限,修改资源X以便当bob访问此资源时,我们检查bob是否具有权限X。现在,我们将在何处应用这一点很清楚,我对此表示怀疑 假设Bob使用标记的枚举对资源拥有读、写、删除权限,我会执行权限。读|权限。写|权限。删除是按位和整数或其他枚举的最终结果吗 要在数据库

我们没有将每个权限拆分为单独的列或sql server表,而是重新考虑将
标志
属性用于
枚举
,以用于按位操作。我们的应用程序定义了用于访问资源(读取、修改、更新)的端点(而不是来自rest服务的端点),并且每个用户都有权限,例如
Bob有读取的权限,修改资源X
以便当bob访问此资源时,我们检查bob是否具有权限X。现在,我们将在何处应用这一点很清楚,我对此表示怀疑

  • 假设Bob使用标记的枚举对资源拥有读、写、删除权限,我会执行
    权限。读|权限。写|权限。删除
    是按位和整数或其他枚举的最终结果吗

  • 要在数据库表中存储此权限,列是否应为
    整数

  • 如果问题1的答案是
    Enum
    ,那么我是否应该在
    Permissions
    Enum上定义另一个表示按位and运算整数值的属性

免责声明:
示例中提到的Bob不代表站点堆栈溢出网络中的任何用户或任何人。这只是另一个角色

  • 用[Flags]标记的枚举值的按位或/和为同一枚举的值
  • 整数是在数据库中存储枚举值的合理字段
  • 不需要,您不需要添加额外的枚举值,但为了方便起见,可以这样做
  • 通常,您可以使用定义这样的枚举,即

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

    My readAndWrite = My.Read | My.Write;
    
    按位AND将为表示唯一标志的枚举值提供0,但通常用于屏蔽其他位:

    bool doIHaveWrite = (readAndWrite & My.Write) == My.Write;
    

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

    要按顺序回答您的问题,请执行以下操作:

    • 假设您已在
      枚举
      上设置了
      [Flags]
      属性,并使用了正确的运算符(
      &
      |
      用于按位操作),则基本上两者都是。如果将结果强制转换为整数,则会得到相关值的按位and,例如7。如果使用
      .ToString()
      ,则会返回一个字符串,指示该值包含所有三个值。我相信在某个地方有一个
      HasFlags()
      方法,但我看到的大多数代码都使用经过验证的真正的按位代码进行比较,即:

      var x = Permissions.Read | Permissions.Write;
      if ((x & Permissions.Read) == Permissions.Read) { print "Success!"; }
      
      从技术角度来看,C#的类型安全性有助于保持事物的正常状态,并且
      ing或
      &
      ing两个相同类型的
      枚举
      的结果是相同类型的另一个
      枚举
      ,但所有
      枚举
      都是简单的整数,在大多数情况下都可以这样处理,尽管有些东西需要显式转换到
      int

    • 它应该是一个完整的类型,是的。我相信枚举的默认类型是
      Int32
      ,但是如果您想精确匹配数据库和代码,可以显式地设置它

    • 考虑到以上所有因素,为常用的权限集(例如
      ReadWrite
      )设置预定义值仍然很有意义。特别是,Microsoft建议所有枚举都使用
      None
      元素,尤其是在您要强制转换值的情况下。这允许为新初始化的变量提供回退和有效值,并为
      default(Permissions)
      提供正常值。可以基于其他值在枚举中设置值,如下所示:

      [Flags]
      enum Permissions {
        None =    0,
        Read =    0x001,
        Write =   0x010,
        Execute = 0x100,
        ReadWrite = Read | Write,
        // [snip]
      }
      

    +1整洁你们两个都帮了我,如果有任何方法,我都可以将这两个标记为答案,天哪,现在没有这样的功能。我将投票you@Mathhew在我脑海中,以整数的形式存储按位或表中的结果。我应该如何办理我的许可签入申请。在这里用代码说话
    if(IntegerFromDb==Permissions.Read){print“Success!”}
    我应该将整数解析为权限类型的枚举并进行检查吗?@Deeptechtons:您可以轻松地将任何整数转换回枚举类型:
    var perms=(Permissions)IntegerFromDb
    。这是最安全的方法,但是我认为您可以直接与我上面包含的代码进行比较,而无需强制转换。始终将
    &
    与预期值进行比较,尤其是在使用建议的
    读写
    等组合值时,因为可能有一个值而没有另一个值,从而愚弄
    !=无
    样式检查。@Deeptechtons:请务必阅读我在第3点中关于枚举的正常值的注释。如果你将一个整数强制转换到一个对给定值没有意义的枚举中,C#可能会播放一些糟糕的东西。这是否意味着我这样做
    Permission.Read | Permission.Write
    而结果整数在Permissions枚举中没有等效的整数值,那么它默认为None(如#3)@Deeptechtons:No,这意味着它等同于
    Permission.Read | Permission.Write,正如预期的那样。但是您试图对我提供的enum强制执行say 9,它不会很好地工作。我不是100%,但我认为它甚至可能抛出一个例外。
    
    [Flags]
    enum Permissions {
      None =    0,
      Read =    0x001,
      Write =   0x010,
      Execute = 0x100,
      ReadWrite = Read | Write,
      // [snip]
    }