c#枚举操作

2021-03-08 19:30

阅读:513

标签:bsp   万全   简写   安全性   blog   打印   turn   href   item   

首先先定义个枚举,后续都会用到这个枚举。

       [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);//

传入对应枚举值就能获取中文备注。

 

c#枚举操作

标签:bsp   万全   简写   安全性   blog   打印   turn   href   item   

原文地址:https://www.cnblogs.com/aqgy12138/p/12773541.html

上一篇:C# 事件

下一篇:为Delphi配置多套环境


评论


亲,登录后才可以留言!