更新和扩展枚举C#
c#
我正在尝试以下问题,但似乎无法弄清楚如何扩展枚举:
问题:
网站上的每个帐户都有一组代表用户访问的访问标志。
更新并扩展枚举,使其包含三个新的访问标志:
- 由 Submit 和 Modify 标志组成的 Writer 访问标志。
- 由删除、发布和评论标志组成的编辑器访问标志。
- 由 Writer 和 Editor 标志组成的所有者访问权限。
例如,下面的代码应该打印“False”,因为 Writer 标志不包含 Delete 标志。
Console.WriteLine(Access.Writer.HasFlag(Access.Delete))
using System;
public class Account
{
[Flags]
public enum Access
{
Delete,
Publish,
Submit,
Comment,
Modify
}
public static void Main(string[] args)
{
//Console.WriteLine(Access.Writer.HasFlag(Access.Delete)); //Should print: "False"
}
}
回答
您可以通过为枚举的每个标志指定一个值来实现此目的,如果在二进制系统中表示,该值仅包含零和一个 1。
[Flags]
public enum Access
{
// Simple flags
Delete = 1, // 00001
Publish = 2, // 00010
Submit = 4, // 00100
Comment = 8, // 01000
Modify = 16, // 10000
// Combined flags
Editor = 11, // 01011
Writer = 20, // 10100
Owner = 31 // 11111
}
这样,writer 将同时具有提交和修改标志,但没有删除标志。
为什么这样做?
HasFlag 方法基本上执行按位与运算。因此,当您检查 delete 是否在编辑器标志中时,它会这样做。只有当两个位都为 1 时,结果位也为 1,否则为 0。
00001
01011
----- &
00001
检查删除是否在写入器中:
00001
10100
----- &
00000
如果结果与您作为参数传递的标志相同,则意味着包含该标志!
更字面意思
您也可以将数字定义为二进制文字。这样就更容易一目了然地看到什么是什么。
[Flags]
public enum Access
{
// Simple flags
Delete = 0b00001,
Publish = 0b00010,
Submit = 0b00100,
Comment = 0b01000,
Modify = 0b10000,
// Combined flags
Editor = Delete | Publish | Comment,
Writer = Submit | Modify,
Owner = Editor | Writer
}
或者,就像我喜欢写的那样
[Flags]
public enum Access
{
// Simple flags
Delete = 1,
Publish = 1 << 1,
Submit = 1 << 2,
Comment = 1 << 3,
Modify = 1 << 4,
// Combined flags
Editor = Delete | Publish | Comment,
Writer = Submit | Modify,
Owner = Editor | Writer
}