c#枚举操作
首先先定义个枚举,后续都会用到这个枚举。
[Flags] public enum BorderSides { Left = 1, Right = 2, Top = 4, Bootom = 8 }
1.将枚举转换为整数
我们通常将枚举转换整数,可以将枚举先转化未object类型然后再转为整数类型。
1 static int GetValue(Enum anyEnum) 2 { 3 return (int)(object)anyEnum; 4 }
那这段代码是不是看起来没有问题了呢。
当然还是有些问题的,如果我传入的枚举的值大于int的最大值,那我这个方法就会报错。
所以万全之策就是用decimal,int是32位,decimal是128位,就算是我这个枚举类型是long(64位)类型的我这个方法用起来也是没问题的。
1 static decimal GetValue(Enum anyEnum) 2 { 3 return Convert.ToDecimal(anyEnum); 4 }
还有一种方法是使用Enum.GetUnderlyingType方法获取枚举的整数类型。
static object GetValue(Enum anyEnum) { var type = Enum.GetUnderlyingType(anyEnum.GetType()); return Convert.ChangeType(anyEnum, type); }
用Enum.GetUnderlyingType方法能过获取到枚举的整数类型,然后通过动态转换。这样也能得到枚举的数值。
上述两种方法我个人是用的比较多的,然后还有一种方法在我另一篇博客(https://www.cnblogs.com/aqgy12138/p/12679492.html)里面讲枚举字符串格式化时候是提到的。
在枚举ToString的时候指定格式字符串d或D都能将字符串转成对应的整数字符串。
2.整数转枚举
这个就很简单了。
使用Eunm.ToObject转换。这个ToObject的重载方法可以接受几乎所有的整数类型,以及object(后者支持任何装箱后的整数类型)。
var bs = Enum.ToObject(typeof(BorderSides),5);
这个可以简写为:
var bs = (BorderSides)5;
这种简写,是使用的比较多的。
3.字符串转枚举
这个就跟基本值类型一样的使用Parse方法就好了。
var leftright = (BorderSides)Enum.Parse(typeof(BorderSides), "Left"); Console.WriteLine(leftright);
4.列举枚举值
//列举枚举值 foreach (var item in Enum.GetValues(typeof(BorderSides))) { Console.WriteLine(item); }
这方法会打印出Left、Right、Top、Bootom
5.枚举的工作方式
枚举的语义很大程度上都是由编译器决定的。在CLR中,枚举实例(未拆箱)与它的实际整数值在运行是没有区别。而且,CLR中定义的枚举仅仅是System.Enum的子类型,而每一个成员则是其静态整数类型字段。这意味着在通常情况下使用枚举是非常高效的,其运行开销和整数常量的开销一致。
而这个方案的缺点在于enum虽然支持静态方式,却不具备强类型安全性。
var result= BorderSides.Left + 1;
Console.WriteLine(result);
上述这段代码不会报错,而且打印的值不是Left而是Right。
6.拓展
在工作的日常开发中,我们想要设置枚举中每个枚举值的中文备注,并且能够拿到自己设置的备注。
通常我们使用Description特性。
public enum BorderSides { [Description("左")] Left = 1, [Description("右")] Right = 2, [Description("上")] Top = 4, [Description("下")] Bootom = 8 }
在设置特性之后通过反射拿到备注。
static string GetEnumDescription(Enum anyEnum) { var type = anyEnum.GetType();//获取枚举的类型 var name = Enum.GetName(type, anyEnum);//获取枚举值的名字 if (name == null) return null; var filed = type.GetField(name);//查看枚举类型中是否有这个枚举值 var attribute = Attribute.GetCustomAttribute(filed, typeof(DescriptionAttribute)) as DescriptionAttribute;//获取备注特性 if (attribute == null) return name; return attribute?.Description; }
GetEnumDescription(BorderSides.Bootom);//下
传入对应枚举值就能获取中文备注。