• 枚举转中文,通过反射方法与描述的方式获取


    示例:

    有人为了显示中文,这样定义枚举吗?

    publicenum TimeOfDay
    {
    上午,
    下午,
    晚上
    };

    这样定义,很别扭,特别是在使用的时候,

    比如,this.Time = TimeOfDay.上午;

    而且你会逐渐发现它的局限性。

    枚举定义很头疼:

    在系统开发中,我们经常使用枚举,但是定义枚举是个头疼的问题。

    按照习惯我们习惯将枚举项定义为英语,但是,在使用的时候,特别针对国内客户的时候,如果显示的英文,则不符合要求,不易于用户使用。

    尽管现在枚举定义也能定义中文枚举项,但在优雅的英文代码中穿插着中语,确实很不爽。如果涉及多语,很难扩展。

    也有人经常用到常量来代替枚举,但这种方法在系统开发中不太可取,具体见:枚举与常量

     

    解决方案:

     

    为了方便用户使用, 希望能够找到一种比较好的方法,将枚举转为我们想要的集合。

    枚举的定义中加入描述,如果要支持多语,则直接修改枚举描述即可。也不用修改其他代码。

    通过反射思想,得到针对某一枚举类型的描述。具体实现起来,有如下代码中的三个不同的的方式。

    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Reflection;
    using System.ComponentModel;
    
    
    namespace EnumApp
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                NameValueCollection nvc = GetNVCFromEnumValue(typeof(TimeOfDay));
    
                Console.WriteLine("1. 反射方式对TimeOfDay结构体的罗列:");
                foreach (string key in nvc.Keys)
                {
                    Console.WriteLine(string.Format(key + ": {0}", nvc[key]));
                }
    
                Console.WriteLine("
    2. 直接方式1,对TimeOfDay结构体的罗列:");
    
                Dictionary<string, string> dic = GetEnumDic(typeof(TimeOfDay));
                foreach (string key in dic.Keys)
                {
                    Console.WriteLine(key + ":{0}", dic[key]);
                }
    
                Console.WriteLine("
    3. 直接方式2,对TimeOfDay结构体中某一项的描述:");
                Console.WriteLine(string.Format(TimeOfDay.Moning.ToString() + ":{0}", GetEnumDes(TimeOfDay.Moning)));
            }
    
            /// <summary>
            /// 从枚举类型和它的特性读出并返回一个键值对
            /// </summary>
            /// <param name="enumType">Type,该参数的格式为typeof(需要读的枚举类型)</param>
            /// <returns>键值对</returns>
            public static NameValueCollection GetNVCFromEnumValue(Type enumType)
            {
                System.Reflection.FieldInfo[] fields;
                string strText, strValue;
                NameValueCollection nvc = new NameValueCollection();
                Type typeDescription = typeof(DescriptionAttribute);
    
                
                fields = enumType.GetFields();
                
                foreach (FieldInfo field in fields)
                {
                    if (field.FieldType.IsEnum)
                    {
                        strValue = ((int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null)).ToString();
                        object[] arr = field.GetCustomAttributes(typeDescription, true);
                        if (arr.Length > 0)
                        {
                            DescriptionAttribute aa = (DescriptionAttribute)arr[0];
                            strText = aa.Description;
                        }
                        else
                        {
                            strText = field.Name;
                        }
                        nvc.Add(strValue, strText);
                    }
                }
                return nvc;
            }
            /// <summary>
            /// 返回 Dic<枚举项,描述>
            /// </summary>
            /// <param name="enumType"></param>
            /// <returns>Dic<枚举项,描述></returns>
            public static Dictionary<string, string> GetEnumDic(Type enumType)
            {
                Dictionary<string, string> dic = new Dictionary<string, string>();
                FieldInfo[] fieldinfos = enumType.GetFields();
                foreach (FieldInfo field in fieldinfos)
                {
                    if (field.FieldType.IsEnum)
                    {
                        Object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
    
                        dic.Add(field.Name, ((DescriptionAttribute)objs[0]).Description);
                    }
    
                }
    
                return dic;
            }
            /// <summary>
            /// 获得某个枚举项的描述
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public static string GetEnumDes(object value)
            {
                FieldInfo fieldinfo = value.GetType().GetField(value.ToString());
                Object[] objs = fieldinfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
                if (objs == null || objs.Length == 0)
                {
                    return value.ToString();
                }
                else
                {
                    return ((DescriptionAttribute)objs[0]).Description;
                }
            }
        }
    
        public enum TimeOfDay
        {
            [Description("上午")]
            Moning = 0,
            [Description("下午")]
            Afternoon,
            [Description("晚上")]
            Evening,
        };
    
        //public enum TimeOfDays
        //{
        //    上午,
        //    下午,
        //    晚上
        //};
    }
    View Code

     

    或者通过下载文件,直接进行测试。EnumDecriptionGet.rar

     

     

     

    参考文章

     

    枚举显示中文问题

     

  • 相关阅读:
    mybaits源码分析--事务管理(八)
    mybaits源码分析--binding模块(五)
    mybaits源码分析--自定义插件(七)
    mybaits源码分析--缓存模块(六)
    2021年9月
    golang-reflect实战ini配置文件
    ECC加密原理详解
    RFID 随手记
    计算机实现加法
    公钥加密算法 RSA
  • 原文地址:https://www.cnblogs.com/arxive/p/6285718.html
Copyright © 2020-2023  润新知