更新和扩展枚举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
}


以上是更新和扩展枚举C#的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>