C#中FlagsAttribute属性在enum中的应用详解

Net C#中枚举的声明格式如下所示:

[attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;]

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中的应用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C# 使用HttpClient模拟请求的案例

    情景描述 将一个时间转换为对应的unix时间戳, 字符集使用UTF-8编码,数据通讯统一采用 HTTP 协议通讯,使用POST 方法请求并传递参数. POST请求Content-Type 设置为application/x-www-form-urlencoded 除此之外,我们对请求添加签名的校验,key设置为X-Sign 接口定义 /// <summary> /// 获取时间戳(毫秒). /// </summary> /// <param name="dateTim

  • c# 实现雪花分形的示例

    C#都没人用了吗,网上想找个现成的雪花分形代码,都没找见,有C++,有python,有java的,就没有C#的,自己试试写一个吧. public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { DrawKochSnow(e.Graphics); } private void ZheXi

  • C# 使用Fiddler捕获本地HttpClient发出的请求操作

    示例接口定义 为了方便笔者先自己写了个简单的接口用于展示,返回当前时间,具体如下 /// <summary> /// GetToday. /// </summary> /// <returns></returns> [HttpGet] [Route("GetTime/Today")] public MyDateTime GetToday() { var now = DateTime.Now; return new MyDateTime {

  • C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形的方法详解

    本文介绍通过C#和VB.NET程序代码来创建和编辑PPT文档中的SmartArt图形.文中将分两个操作示例来演示创建和编辑结果. 使用工具:Spire.Presentation for .NET hotfix 5.9.5 Dll文件引用: 方式1:下载包.下载后,解压,打开Bin文件夹,根据自己用的.NET Framework选择相应的文件夹,如:此示例中使用的是NET4.0,即打开NET4.0文件,找到Spire.Presentation.dll文件.找到dll文件后,在vs程序中添加引用该d

  • C#中FlagsAttribute属性在enum中的应用详解

    Net C#中枚举的声明格式如下所示: [attributes] [modifiers] enum identifier [:base-type] {enumerator-list} [;] FlagsAttribute属性就是枚举类型的一项可选属性.它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域). 所谓位域 是单个存储单元内相邻二进制位的集合. 通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要. enum MyFlags { Flag1, Flag2, Flag

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • Vue中使用方法、计算属性或观察者的方法实例详解

    熟悉 Vue 的都知道 方法methods.计算属性computed.观察者watcher 在 Vue 中有着非常重要的作用,有些时候我们实现一个功能的时候可以使用它们中任何一个都是可以的,但是它们之间又存在一些不同之处,每一个都有一些适合自己的场景,我们要想知道合适的场景,肯定先对它们有一个清楚的了解,先看一个小例子. <div id="app"> <input v-model="firstName" type="text"&

  • Struts中的Action 单例与多例详解

     Struts中的Action 单例与多例详解 struts2中action是多例的,即每次访问网络地址的时候都会产生一个action public class pr_action { public pr_action(){ System.out.println("创建action成功!!!"); } public void execute(){ } } 运行代码可以看到,每次访问该网络地址都会在控制台输出一次!!! 如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修

  • python中requests库session对象的妙用详解

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies. 举个栗子,跨请求保持cookies,在命令行上输入下面命令: # 创建一个session对象 s = requests.Session() # 用session对象发出get请求,设置cookies s.get('http://ht

  • java 中mongodb的各种操作查询的实例详解

    java 中mongodb的各种操作查询的实例详解 一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用regex...) public PageUrl getByUrl(String url) { return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class); } 2. 查询多条数据:linkUrl.id 属于分级查询 public Lis

  • HTML中使背景图片自适应浏览器大小实例详解

    HTML中使背景图片自适应浏览器大小实例详解 解决办法: 1.图片不够大,又background属性不能拉伸图片: 2.只能用个div,把其z-index值设为负,并使这个div大小为整个body大小,在div里用<img> : 3.body的background属性去掉,要不然会被遮住. <html> <body> <div id="Layer1" style="position:absolute; left:0px; top:0p

  • 微信小程序中button组件的边框设置的实例详解

    微信小程序中button组件的边框设置的实例详解 button的边框是用:after方式实现的,用户如果在button上定义边框会出现两条线,需用:after的方式去覆盖默认值. 如果设置了Button的背景色,没有用:after设置边框的颜色,则button的四个角会出现模糊的尖角.如下图所示: 如上图四个角会模糊..wxss代码如下: .clickEncryptBtn{ width:130px; border-radius: 3px; margin:20px auto; padding-to

  • Mybatis中的resultType和resultMap查询操作实例详解

    resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比如:列名和对象属性名不一致时可以使用resultMap来配置:还有查询的对象中包含其他的对象等. MyBatisConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configura

  • vue中引用swiper轮播插件的教程详解

    有时候我们需要在vue中使用轮播组件,如果是在vue组件中引入第三方组件的话,最好通过npm安装,从而进行统一安装包管理. 申明:本文所使用的是vue.2x版本. 通过npm安装插件:  npm install swiper --save-dev 在需要使用swiper的组件里引入swiper,swiper的初始化放在mounted里 Slider.vue源码: <template> <div class="swiper-container"> <div

随机推荐