枚举是一组命名整型常量。枚举类型是使用 enum 关键字声明的。
C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。
一、枚举的定义
枚举列表中的每个符号代表一个整数值, 一个比它前面的符号大的整数值。默认情况下,第一个枚举符号的值是 0。
1 public enum Days 2 { 3 Monday = 0, 4 Tuesday, 5 Wednesday, 6 Thursday = 10, 7 Friday, 8 Saturday, 9 Sunday 10 } 11 12 static void Main(string[] args) 13 { 14 Console.WriteLine((int)Days.Tuesday); 15 Console.WriteLine((int)Days.Friday); 16 Console.ReadLine(); 17 }
枚举中每个元素的基础类型都是int,可以使用冒号指明另一种整数类型。已批准的枚举类型有:byte、sbyte、short、ushort、int、uint、long、ulong
1 public enum Days : byte 2 { 3 Monday, 4 Tuesday, 5 Wednesday, 6 Thursday, 7 Friday, 8 Saturday, 9 Sunday 10 }
二、enum、int、string三种类型之间的互转
1 public enum Gender 2 { 3 男, 4 女 5 } 6 7 static void Main(string[] args) 8 { 9 Console.WriteLine("enum ---> int : " + (int)Gender.男); 10 11 Console.WriteLine("enum ---> string : " + Convert.ToString(Gender.男)); 12 Console.WriteLine("enum ---> string : " + Gender.女.ToString()); 13 14 Console.WriteLine("int ---> enum : " + (Gender)0); 15 16 Console.WriteLine("int ---> string : " + Enum.GetName(typeof(Gender), 0)); 17 18 Console.WriteLine("string ---> enum :" + Enum.Parse(typeof(Gender), "男")); 19 20 Console.ReadLine(); 21 }
三、循环enum
1 static void Main(string[] args) 2 { 3 foreach (var gender in Enum.GetValues(typeof(Gender))) 4 { 5 Console.WriteLine(gender.ToString() + "=" + (int)gender); 6 } 7 Console.ReadLine(); 8 }
四、获取enum的描述信息
1 public enum GenderDesc 2 { 3 [Description("male")] 4 男, 5 [Description("female")] 6 女 7 } 8 9 static void Main(string[] args) 10 { 11 Console.WriteLine("女 描述信息 : " + (Description(Gender.女) ?? "null")); 12 Console.WriteLine("女 描述信息 : " + (Description(GenderDesc.女) ?? "null")); 13 14 Console.ReadLine(); 15 } 16 17 ///18 /// 获取枚举值的描述文本 19 /// 20 /// 枚举值 21 /// 22 public static string Description(this Enum e) 23 { 24 Type enumType = e.GetType(); 25 var fieldInfo = enumType.GetFields().FirstOrDefault(a => a.Name == Enum.GetName(enumType, e)); 26 object[] obj = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); 27 if (obj == null || obj.Length == 0) return null; 28 29 DescriptionAttribute des = (DescriptionAttribute)obj[0]; 30 return des.Description; 31 }
五、枚举转换成字典集合的方法
1 public enum Gender 2 { 3 男, 4 女 5 } 6 7 static void Main(string[] args) 8 { 9 Console.WriteLine("int ---> string : " + EnumHelper.GetEnumName(1)); 10 11 var dic1 = EnumHelper.getEnumDic (); 12 Console.WriteLine("enum ---> dictionary : "); 13 foreach (var item in dic1) 14 { 15 Console.WriteLine(item.Key + "==" + item.Value); 16 } 17 18 Console.WriteLine("enum ---> dictionary : "); 19 var dic = EnumHelper.GetDic (); 20 foreach (var item in dic) 21 { 22 Console.WriteLine(item.Key + "==" + item.Value); 23 } 24 25 Console.ReadLine(); 26 }
1 public static class EnumHelper 2 { 3 ///4 /// 根据枚举的值获取枚举名称 5 /// 6 /// 枚举类型 7 /// 枚举的值 8 /// 9 public static string GetEnumName (this int status) 10 { 11 return Enum.GetName(typeof(T), status); 12 } 13 /// 14 /// 获取枚举名称集合 15 /// 16 /// 17 /// 18 public static string[] GetNamesArr () 19 { 20 return Enum.GetNames(typeof(T)); 21 } 22 /// 23 /// 将枚举转换成字典集合 24 /// 25 /// 枚举类型 26 /// 27 public static Dictionary<string, int> getEnumDic () 28 { 29 30 Dictionary<string, int> resultList = new Dictionary<string, int>(); 31 Type type = typeof(T); 32 var strList = GetNamesArr ().ToList(); 33 foreach (string key in strList) 34 { 35 string val = Enum.Format(type, Enum.Parse(type, key), "d"); 36 resultList.Add(key, int.Parse(val)); 37 } 38 return resultList; 39 } 40 /// 41 /// 将枚举转换成字典 42 /// 43 /// 44 /// 45 public static Dictionary<string, int> GetDic () 46 { 47 Dictionary<string, int> dic = new Dictionary<string, int>(); 48 Type t = typeof(TEnum); 49 var arr = Enum.GetValues(t); 50 foreach (var item in arr) 51 { 52 dic.Add(item.ToString(), (int)item); 53 } 54 55 return dic; 56 } 57 }
五、枚举总结
枚举变量的使用能避免编码时的HardCode, 有效的提升代码的可读性和可扩展性,当然后期的维护也可以方便很多。
六、参考文章
https://www.cnblogs.com/BluceLee/p/8989479.html