C#中的枚举(Enum)你知道多少呢?

简介:

写个随笔文章是最难想的,我要是写个C#枚举个人小结,估计博客园的各位园有也觉得是哪个刚接触C#的人写的,要是取个名字叫C#枚举,又觉得不能完全表达自己的意思,现在这个名字看起来还凑合吧,写篇文章不容易,大家且看且珍惜,文章的开头废话依然是很多,大家就将就一下,说个小事情,我个人写的文章不一定有什么技术含量,也不一定能解决什么高大上的问题,但是文章出自个人的辛苦研究总结所得,如果你抓取了我的请贴上文章链接,最恶心的莫过于红黑联盟,抓了文章不给链接(博文主页http://www.cnblogs.com/xiaofeixiang/),进入正题吧:

枚举(Enum)定义

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

1
2
3
4
5
6
enum  MemberLevel
{
     gold,
     silver,
     copper

枚举值获取

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string  s = Enum.GetName( typeof (MemberLevel), 3);
  Console.WriteLine(s);
 
  Console.WriteLine( "MemberLevel中的值:" );
  foreach  ( int  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,如下所示:

1
2
3
4
5
6
enum  MemberLevel: long
{
     gold = 2147483648L,
     silver=232L,
     copper=10L
}

枚举Flags和Description特性值

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

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

  程序运行如下所示:

1
2
3
4
5
// 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..去判断,如果枚举比较多,自己写的也很不爽.特性这个时候刚发挥作用了,如下所示: 

1
2
3
4
5
6
7
8
9
10
[Description( "会员等级" )]
enum  MemberLevel
{
     [Description( "金牌会员" )]
     gold =1,
     [Description( "银牌会员" )]
     silver = 2,
     [Description( "铜牌会员" )]
     copper =3
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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;
 
     }
}

  主程序调用如下所示:

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

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/3872142.html,如需转载请自行联系原作者

相关文章
|
2月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
50 0
|
2月前
|
安全 API C#
C#.Net筑基-类型系统②常见类型--枚举Enum
枚举(enum)是C#中的一种值类型,用于创建一组命名的整数常量。它们基于整数类型(如int、byte等),默认为int。枚举成员可指定值,未指定则从0开始自动递增。默认值为0。枚举可以与整数类型互相转换,并可通过`[Flags]`特性表示位域,支持位操作,用于多选场景。`System.Enum`类提供了如`HasFlag`、`GetName`等方法进行枚举操作。
|
12月前
|
存储 C#
C#基础⑥.1——枚举、结构体
枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。也就是一些固定范围的值。
|
12月前
|
C#
【C#视频】常量、枚举、结构体、数组
【C#视频】常量、枚举、结构体、数组
|
12月前
|
存储 C#
C#基础Ⅵ❶-枚举、结构体
C#基础Ⅵ❶-枚举、结构体
|
存储 C# C++
C# 结构体(Struct)、 枚举(Enum)
C# 结构体(Struct) 在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。 结构体是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本书的以下属性:
205 0
|
开发框架 .NET C#
c# 枚举之间的转换
c# 枚举之间的转换
155 0
|
存储 C# vr&ar
【100个 Unity小知识点】 | C#中通过 数字int值 获取 枚举Enum 中的数值
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
|
2月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。