枚举类型是一组给变量提供指定赋值的组合。
如定义一个Day变量,只能赋值周一到周日,则可以用枚举进行限定
enum Day
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
Day d = Day.Sunday;
枚举位标识
每一个枚举类型都有一个从0开始的默认的位标识,使用(int)d可以显示转换为整数来输出标识,也可以手动赋予标识。既然可以获取枚举类型的位标识,也可以通过位标识来赋值,如:
Day d = (Day)1;
有趣的是,还可以给枚举类型赋值单个字符,如’T’,如果是超过2个字符则会提示字符太多报错,说明位标识还是会将单个字符转换为int类型进行存储,如:
enum Day
{
Sunday,
Monday,
Tuesday='T',
Wednesday,
Thursday,
Friday,
Saturday=10
};
……
Day d = Day.Sunday;
Day t = (Day)'T';
Day s = (Day)10;
Console.WriteLine("{0},{1},{2}", d, t, s);
Console.WriteLine("{0},{1},{2}", (int)d, (char)t, (int)s);
运行结果:
Sunday,Tuesday,Saturday
0,T,10
枚举的位标识可以是除 char 以外的任何整型,默认是int类型,还支持byte、sbyte、short、ushort、uint、long 或 ulong等整型类型。如果需要使用其他的整数类型,就需要进行声明类型,否则超出int类型的范围会报错,格式如:
enum Day:long
{
Sunday=10000000000,
}
这里需要注意的是,成员位标识默认会根据上一个成员的标识加1,例如将上面Wednesday的位标识修改为100,则无法再用原来的(Day)4获得Thursday的值,而是变成(Day)101,后面的成员依次加1。
枚举描述(Description)
一般我们在使用枚举变量的时候可能还需要输出指定的内容,比如sunday就输出周日,就需要使用if-else进行循环判断。这里介绍一个枚举类型的特性,就是可以通过Description给枚举成员添加并输出描述,例子如下:
using System;
using System.ComponentModel;//用于支持Description
using System.Reflection;//用于支持FieldInfo
[Description("星期")]
enum Day
{
[Description("周日")]
Sunday = 100,
[Description("周一")]
Monday,
[Description("周二")]
Tuesday,
[Description("周三")]
Wednesday,
[Description("周四")]
Thursday,
[Description("周五")]
Friday,
[Description("周六")]
Saturday
};
namespace Test
{
static class Program
{
static void Main(string[] args)
{
Day d = Day.Sunday;
Day t = (Day)101;
Day s = (Day)102;
Console.WriteLine("{0},{1},{2}", d, t, s);
//string today = GetDescription(s, true);
Console.WriteLine("{0},{1},{2}", GetDescription(d, true), GetDescription(t, true), GetDescription(s, true));
Console.ReadKey();
}
/// <summary>
/// 获取枚举类型对应的描述
/// </summary>
/// <param name="value"></param>枚举成员的值
/// <param name="nameInstead"></param>枚举成员是否包含描述
/// <returns></returns>
public static string GetDescription(this Enum value, Boolean nameInstead = true)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (name == null)
{
return null;
}
FieldInfo field = type.GetField(name);
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribut e;
if (attribute == null && nameInstead == true)
{
return name;
}
return attribute == null ? null : attribute.Description;
}
}
}
运行结果:Sunday,Monday,Tuesday
周日,周一,周二