C# 在c中定义权限集的枚举#
我们没有将每个权限拆分为单独的列或sql server表,而是重新考虑将C# 在c中定义权限集的枚举#,c#,.net,permissions,enums,flags,C#,.net,Permissions,Enums,Flags,我们没有将每个权限拆分为单独的列或sql server表,而是重新考虑将标志属性用于枚举,以用于按位操作。我们的应用程序定义了用于访问资源(读取、修改、更新)的端点(而不是来自rest服务的端点),并且每个用户都有权限,例如Bob有读取的权限,修改资源X以便当bob访问此资源时,我们检查bob是否具有权限X。现在,我们将在何处应用这一点很清楚,我对此表示怀疑 假设Bob使用标记的枚举对资源拥有读、写、删除权限,我会执行权限。读|权限。写|权限。删除是按位和整数或其他枚举的最终结果吗 要在数据库
标志
属性用于枚举
,以用于按位操作。我们的应用程序定义了用于访问资源(读取、修改、更新)的端点(而不是来自rest服务的端点),并且每个用户都有权限,例如Bob有读取的权限,修改资源X
以便当bob访问此资源时,我们检查bob是否具有权限X。现在,我们将在何处应用这一点很清楚,我对此表示怀疑
- 假设Bob使用标记的枚举对资源拥有读、写、删除权限,我会执行
是按位和整数或其他枚举的最终结果吗权限。读|权限。写|权限。删除
- 要在数据库表中存储此权限,列是否应为
整数
- 如果问题1的答案是
,那么我是否应该在Enum
Enum上定义另一个表示按位and运算整数值的属性Permissions
免责声明:
示例中提到的Bob不代表站点堆栈溢出网络中的任何用户或任何人。这只是另一个角色
My readAndWrite = My.Read | My.Write;
按位AND将为表示唯一标志的枚举值提供0,但通常用于屏蔽其他位:
bool doIHaveWrite = (readAndWrite & My.Write) == My.Write;
请注意,逻辑AND(&&)不能应用于枚举值。要按顺序回答您的问题,请执行以下操作:
- 假设您已在
上设置了枚举
属性,并使用了正确的运算符([Flags]
和&
用于按位操作),则基本上两者都是。如果将结果强制转换为整数,则会得到相关值的按位and,例如7。如果使用|
,则会返回一个字符串,指示该值包含所有三个值。我相信在某个地方有一个.ToString()
方法,但我看到的大多数代码都使用经过验证的真正的按位代码进行比较,即:HasFlags()
从技术角度来看,C#的类型安全性有助于保持事物的正常状态,并且var x = Permissions.Read | Permissions.Write; if ((x & Permissions.Read) == Permissions.Read) { print "Success!"; }
ing或
ing两个相同类型的&
的结果是相同类型的另一个枚举
,但所有枚举
都是简单的整数,在大多数情况下都可以这样处理,尽管有些东西需要显式转换到枚举
int
- 它应该是一个完整的类型,是的。我相信枚举的默认类型是
,但是如果您想精确匹配数据库和代码,可以显式地设置它Int32
- 考虑到以上所有因素,为常用的权限集(例如
)设置预定义值仍然很有意义。特别是,Microsoft建议所有枚举都使用ReadWrite
元素,尤其是在您要强制转换值的情况下。这允许为新初始化的变量提供回退和有效值,并为None
提供正常值。可以基于其他值在枚举中设置值,如下所示:default(Permissions)
[Flags] enum Permissions { None = 0, Read = 0x001, Write = 0x010, Execute = 0x100, ReadWrite = Read | Write, // [snip] }
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]
}