温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#中FlagsAttribute属性如何在enum中的使用

发布时间:2020-10-26 17:07:37 来源:亿速云 阅读:208 作者:Leah 栏目:开发技术

今天就跟大家聊聊有关C#中FlagsAttribute属性如何在enum中的使用 ,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。

所谓位域 是单个存储单元内相邻二进制位的集合。

通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。

enum MyFlags { Flag1, Flag2, Flag3, Flag4}; 
MyFlags myFlag = MyFlags.Flag2 | MyFlags.Flag3; 
Console.WriteLine(myFlag);//Flag4

因为对于整数来说,| 操作就是将其转化为二进制再进行或运算。Flags.Flag2 | Flags.Flag3做的工作实际上是 0001 | 0010 = 0011 = 3再转换成(MyFlags)3就是Flag4了

如果枚举声明如下:

[FlagsAttribute]
enum MyFlags{
   Flag1 = 0,  //000
   Flag2 = 1,  //001
   Flag3 = 2,  //010
   Flag4 = 4   //100
};

则上述结果为Flag2,Flag3,这样做的意义在于我们可以实现“或”的关系。

就上例而言,myFlag可以更直观的表现为011,因此当我们想要检验它满足哪个枚举值时我们可以使用&操作:

if((myFlag & MyFlags.Flag2) == MyFlags.Flag2)
{
   Console.WriteLine("true");
}
if((myFlag & MyFlags.Flag3) == MyFlags.Flag3)
 
{
   Console.WriteLine("true");
}

011&001 = 001,011&010 = 010,因此这两个if都会成立,这就是这种枚举的意义吧。另外我们应当注意默认初始化的myFlag的值为0,与其作&运算不会有任何结果。

补充知识:C# 使用特性(Attribute)来汉化枚举类

一、新建枚举

public enum CRUD
{
  Create,  
  Retrieve,
  Update,
  Delete
}

二、新建特性类

public sealed class ChineseAttribute : Attribute
{
  public string Chinese { get; set; }
  public ChineseAttribute(string _chinese = "未汉化")
  {
    Chinese = _chinese;
  }
}

三、利用反射获取特性

这里我们写一个枚举类的扩展方法

public static string GetChinese(this Enum value)
{
  Type objType = value.GetType();
  Type attrType = typeof(ChineseAttribute);

  FieldInfo field = objType.GetField(value.ToString());

  //利用反射找是否有【Chinese】特性
  if (field.IsDefined(attrType))
  {
    var chinese = field.GetCustomAttribute<ChineseAttribute>();
    return chinese.Chinese;
  }
  //没有定义Chinese特性,直接返回具体指
  return value.ToString();
}

四、给枚举类添加特性

public enum CRUD
{
  [Chinese("创建")]
  Create,

  [Chinese("读取")]
  Retrieve,

  [Chinese]
  Update,
  Delete
}

五、测试

static void Main(string[] args)
{
  List<MyEnum.CRUD> values = new List<MyEnum.CRUD> 
  { 
    MyEnum.CRUD.Create, 
    MyEnum.CRUD.Delete, 
    MyEnum.CRUD.Retrieve, 
    MyEnum.CRUD.Update 
  };

  foreach (var item in values)
  {
    Console.WriteLine(item.GetChinese());
  }
  Console.Read();
}

效果如下

C#中FlagsAttribute属性如何在enum中的使用

看完上述内容,你们对C#中FlagsAttribute属性如何在enum中的使用 有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI