更新和扩展C#中的枚举类型

7

我正在尝试以下问题,但似乎无法弄清楚如何扩展枚举:

问题

网站上每个帐户都有一组访问标志,表示用户的访问权限。

更新并扩展枚举,使其包含三个新的访问标志:

  • 一个“Writer”访问标志,由“Submit”和“Modify”标志组成。
  • 一个“Editor”访问标志,由“Delete”,“Publish”和“Comment”标志组成。
  • 一个“Owner”访问标志,由“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"
  }
}

3
无法做到。只需为您的原始枚举添加更多的值即可。 - Charlieface
我已经添加了一个链接到我正在尝试的完整问题 - 也许这可以提供更多的上下文?我刚刚尝试在我的问题中进行简化。 - AxleWack
1
我们无法访问该链接 - 它会出现错误。 - Hogan
2
即使我们能够访问它,所有相关信息都应该在帖子中,而不是从外部网站链接。当外部内容已被删除(或现在无法访问)时,帖子需要免疫无效化。 - madreflection
哦,那很奇怪 - 好的,我已经更新了我的帖子并提供了整个问题...虽然这不是我的首选,但希望这可以更有帮助。感谢任何帮助理解这个问题! - AxleWack
显示剩余3条评论
1个回答

14

你可以通过给枚举的每个标志赋一个值,如果用二进制表示,则该值仅由零和一个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
}

这样,作者将具有提交和修改标志,但没有删除标志。

为什么它能运行?

HasFlag方法基本上执行按位AND操作。因此,当您检查编辑器标志中是否存在删除时,它会执行此操作。只有在两个位都是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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接