C#中的枚举类型(Enum)介绍

作者:Fly_Elephant 时间:2023-06-23 18:20:06 

枚举(Enum)定义

enum关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它。但是,还可以将枚举嵌套在类或结构中。现在的有些电商网站根据购物的积分用到的,金牌会员,银牌会员,铜牌会员.

enum MemberLevel
{
   gold,
   silver,
   copper
}

枚举值获取

一般获取的时候包括获取变量和变量值,默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。直接使用Enum中的静态方法即可操作.GetValues中获取的是枚举变量的值,类型是枚举名,之后自动输出的是枚举名.

string s = Enum.GetName(typeof(MemberLevel), 3);
Console.WriteLine(s);

Console.WriteLine("MemberLevel中的值:");
foreach (int i in Enum.GetValues(typeof(MemberLevel)))
    Console.WriteLine(i);
Console.WriteLine("MemberLevel中的值(注意类型):");
foreach (MemberLevel i in Enum.GetValues(typeof(MemberLevel)))
    Console.WriteLine(i);

Console.WriteLine("MemberLevel中的变量:");
foreach (string str in Enum.GetNames(typeof(MemberLevel)))
    Console.WriteLine(str);
System.Console.Read();

枚举类型

曾经很长的一段时间自己一度以为枚举的值只能是int类型,其实每种枚举类型都有基础类型,该类型可以是除 char以外的任何整型(重点)。枚举元素的默认基础类型为 int.准许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long 或 ulong。如果枚举值为long,如下所示:

enum MemberLevel:long
{
   gold = 2147483648L,
   silver=232L,
   copper=10L
}

枚举Flags和Description特性值

可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。创建位标志枚举的方法是应用System.FlagsAttribute特性并适当定义一些值,以便可以对这些值执行AND、OR、NOT和XOR按位运算。一般情况下如果零值不表示“未设置任何标志”,则请不要为标志指定零值.

[Flags]
enum MemberLevel
{
   [Description("二进制表示为1----0001")]
   gold = 0x1,
   [Description("二进制表示为4----0010")]
   silver = 0x04,
   [Description("二进制表示为16----0100")]
   copper = 0x10
}

程序运行如下所示:

// 0001(Gold) and 0100(silver) => 0101(5).
MemberLevel options = MemberLevel.gold | MemberLevel.silver;
Console.WriteLine(options);
Console.WriteLine((int)options);
System.Console.Read();

上面的基本上属于入门的知识,在项目中通常用到的是在枚举变量上面加上Description,需要显示的枚举的特性值,枚举的值一般为int在数据库中占用空间比较小,枚举的变量用于给数据库中的字段赋值,那么如果要显示字段就需要考虑到Descripttion特性,显示中文名称,例如一个用户的的等级在数据中存储的是1,显示的时候显示为金牌用户,当然也可以使用switch,if..else..去判断,如果枚举比较多,自己写的也很不爽.特性这个时候刚发挥作用了,如下所示:

[Description("会员等级")]
enum MemberLevel
{
   [Description("金牌会员")]
   gold =1,
   [Description("银牌会员")]
   silver = 2,
   [Description("铜牌会员")]
   copper =3
}

首先来写一个扩展,静态类,静态方法,this关键字,istop主要是用来获取枚举上面的描述.

public static class EnumHelper
{
   /// <summary>
   /// 返回枚举项的描述信息。
   /// </summary>
   /// <param name="value">要获取描述信息的枚举项。</param>
   /// <returns>枚举想的描述信息。</returns>
   public static string GetDescription(this Enum value, bool isTop = false)
   {
       Type enumType = value.GetType();
       DescriptionAttribute attr = null;
       if (isTop)
       {
           attr = (DescriptionAttribute)Attribute.GetCustomAttribute(enumType, typeof(DescriptionAttribute));
       }
       else
       {
           // 获取枚举常数名称。
           string name = Enum.GetName(enumType, value);
           if (name != null)
           {
               // 获取枚举字段。
               FieldInfo fieldInfo = enumType.GetField(name);
               if (fieldInfo != null)
               {
                   // 获取描述的属性。
                   attr = Attribute.GetCustomAttribute(fieldInfo,typeof(DescriptionAttribute), false) as DescriptionAttribute;
               }
           }
       }

if (attr != null && !string.IsNullOrEmpty(attr.Description))
           return attr.Description;
       else
           return string.Empty;

}
}

主程序调用如下所示:

MemberLevel gold = MemberLevel.gold;
Console.WriteLine(gold.GetDescription());
System.Console.Read();

来源:https://www.cnblogs.com/xiaofeixiang/p/3872142.html

标签:C#,枚举,类型,Enum
0
投稿

猜你喜欢

  • C#实现单词本功能

    2021-11-06 13:08:23
  • C语言中数据是如何存储在内存中的

    2021-07-03 02:13:34
  • 如何修改FeginCilent定义的服务名到指定服务

    2022-07-05 05:49:05
  • Java 数组高频考点分析讲解

    2021-09-01 13:14:36
  • SpringBoot集成redis实现分布式锁的示例代码

    2022-08-24 19:21:56
  • OpenGL绘制贝塞尔曲线

    2022-02-28 11:51:57
  • Android开发中MotionEvent坐标获取方法分析

    2022-03-29 02:43:42
  • spring boot 常见http请求url参数获取方法

    2023-01-26 13:59:43
  • C#自定义缓存封装类实例

    2023-10-15 09:24:27
  • java结合HADOOP集群文件上传下载

    2022-12-14 23:08:52
  • 详解如何在SpringBoot中自定义参数解析器

    2023-07-24 16:06:51
  • java结合email实现自动推送功能

    2023-07-09 00:16:43
  • 一篇文章带你入门Java Script

    2023-09-12 06:09:24
  • Spring Security登录表单配置示例详解

    2023-10-12 09:03:55
  • 学习C#静态函数及变量的一个精典例子与代码

    2021-10-08 18:53:52
  • 详解Java中Iterable与Iterator用法

    2022-05-14 04:25:30
  • springboot+spring data jpa实现新增及批量新增方式

    2023-01-27 03:45:53
  • c#多线程编程基础

    2021-11-24 23:37:12
  • android系统在静音模式下关闭camera拍照声音的方法

    2021-09-04 00:34:20
  • Java多线程Atomic包操作原子变量与原子类详解

    2023-08-18 07:46:25
  • asp之家 软件编程 m.aspxhome.com