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
同类型的,但是所有的enum
s为简单的整数,并且在大多数情况下被视为这样的,虽然有些事情需要明确的演员表来自/来自int
.
它应该是一个整体类型,是的.我相信枚举的默认类型是Int32
,但是如果要完全匹配数据库和代码,则可以显式设置.
鉴于上述所有情况,例如,为常用的权限集预定义值仍然很有意义ReadWrite
.特别是,None
Microsoft建议所有枚举使用一个元素,特别是如果要构建值.这允许为新近初始化的变量提供回退和有效值,以及为其提供合理的值default(Permissions)
.您可以根据其他类似设置枚举值:
[Flags]
enum Permissions {
None = 0,
Read = 0x001,
Write = 0x010,
Execute = 0x100,
ReadWrite = Read | Write,
// [snip]
}
Run Code Online (Sandbox Code Playgroud)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(&&)不能应用于枚举值.
归档时间: |
|
查看次数: |
2263 次 |
最近记录: |