zoukankan      html  css  js  c++  java
  • 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);//

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

  • 相关阅读:
    面试求职:数据库常见面试题(数据库优化思路)
    数据库优化面试内容
    nginx笔记-3
    webpack-问题记录
    [Tips] Linux查看系统环境变量
    解决input框中加入disabled="disabled"之后,改变字体的颜色(默认的是灰色)
    js 中日期转换成时间戳
    Day09_课程预览 Eureka Feign
    Day08_课程图片管理与分布式文件系统
    Day08_分布式文件系统FastDFS研究
  • 原文地址:https://www.cnblogs.com/aqgy12138/p/12773541.html
Copyright © 2011-2022 走看看