zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

中文方法反射 获取 方式 通过 枚举 描述
2023-09-14 09:02:22 时间

示例:

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

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("\n2. 直接方式1,对TimeOfDay结构体的罗列:");

            Dictionary<string, string> dic = GetEnumDic(typeof(TimeOfDay));
            foreach (string key in dic.Keys)
            {
                Console.WriteLine(key + ":{0}", dic[key]);
            }

            Console.WriteLine("\n3. 直接方式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

 

 

 

参考文章

 

枚举显示中文问题