今天和大家分享一个给Enum加备注的技巧,话不多说,先上一段代码:

namespace TestReflector.Model.Entities
{
    public class UserInfo
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public UserStatusEnum UserStatus { get; set; }
    }
    public enum UserStatusEnum
    {
        /// 
        /// 待审核
        /// 
        WaitAudit,
        /// 
        /// 审核中
        /// 
        Auditing,
        /// 
        /// 已审核
        /// 
        Audited
    }
}

  相信大家在项目中都遇到过这种情况吧,用户的状态只是一个枚举,但UI层确需要显示对应的提示信息(例如“待审核”)。

  怎样将Enum转换为字符串,写个转换方法?No!!!

  下面介绍一种插入元数据的方式来实现此功能,使代码易维护,又不会分散在各个地方:

 

  1. 首先建立一个工具类:

/// 
    /// 枚举类型扩展方法类
    /// 
    public static class EnumExtention
    {
        /// 
        /// 获取枚举值的详细文本[Description]
        /// 
        /// 
        /// 
        public static string GetDescription(this System.Enum target)
        {
            Type t = target.GetType();
            //获取字段信息
            System.Reflection.FieldInfo[] fieldInfos = t.GetFields();
            foreach (System.Reflection.FieldInfo info in fieldInfos)
            {
                //判断名称是否相等
                if (info.Name != target.ToString()) continue;
                #region 4.5
                ////反射出自定义属性
                //var dscript = info.GetCustomAttribute(true);
                ////类型转换找到一个Description,用Description作为成员名称
                //if (dscript != null)
                //    return dscript.Description; 
                #endregion
                #region 3.5
                //反射出自定义属性
                foreach (Attribute attr in info.GetCustomAttributes(true))
                {
                    //类型转换找到一个Description,用Description作为成员名称
                    var dscript = attr as DescriptionAttribute;
                    if (dscript != null)
                        return dscript.Description;
                }
                #endregion
            }
            //如果没有检测到合适的注释,则用默认名称
            return target.ToString();
        }
    }

 2.第二步,我们来修改原来的UserStatusEnum:

public enum UserStatusEnum
    {
        /// 
        /// 待审核
        /// 
        [Description("待审核")]
        WaitAudit,
        /// 
        /// 审核中
        /// 
        [Description("审核中")]
        Auditing,
        /// 
        /// 已审核
        /// 
        [Description("已审核")]
        Audited
    }

不要忘记导入命名空间:

using System.ComponentModel;

3. OK,准备工作已经做好了,使用方法如下:

class Program
    {
        private static void Main(string[] args)
        {
            var userStatus = UserStatusEnum.Auditing;
            string strUserStatus = userStatus.GetDescription();
            Console.WriteLine(strUserStatus);
            Console.ReadKey();
        }
    }

5. 到了现在已经可以告一段落了,我们的小工具已经实现了需要的功能。但反射的效率如何呢?

  我可以告诉大家的是:效率不堪入目。。。




可以看出。优化过后的代码执行效率提升了10倍左右。好了,今天的文章分享到这里,希望可以给大家带来方便。

/// 
     /// 枚举类型扩展方法类
     /// 
     public static class EnumExtention
     {
         private static readonly Dictionary CacheFieldInfo = new Dictionary();
         private static readonly Dictionary CacheDescriptionAttr = new Dictionary();
 
         /// 
         /// 获取枚举值的详细文本[Description]
         /// 
         /// 
         /// 
         public static string GetDescription(this System.Enum target)
         {
             Type t = target.GetType();
             var typeHandle = t.TypeHandle;
             string strTarget = Enum.GetName(t, target);
 
             //获取字段信息
             System.Reflection.FieldInfo[] arrFieldInfo;
             if (CacheFieldInfo.ContainsKey(typeHandle))
             {
                 arrFieldInfo = CacheFieldInfo[typeHandle];
             }
             else
             {
                 arrFieldInfo = t.GetFields();
                 CacheFieldInfo[typeHandle] = arrFieldInfo;
             }
 
             for (int i = arrFieldInfo.Length - 1; i >= 0; i--)
             {
                 var fieldInfo = arrFieldInfo[i];
 
                 //判断名称是否相等
                 if (fieldInfo.Name != strTarget) continue;
 
                 #region 3.5
 
                 //反射出自定义属性
                 if (CacheDescriptionAttr.ContainsKey(strTarget))
                 {
                     var dscript = CacheDescriptionAttr[strTarget];
                     return dscript.Description;
                 }
                 else
                 {
                     var arrAttr = fieldInfo.GetCustomAttributes(true);
                     for (int j = arrAttr.Length - 1; j >= 0; j--)
                     {
                         var attr = arrAttr[j];
                         //类型转换找到一个Description,用Description作为成员名称
                         var dscript = attr as DescriptionAttribute;
                         if (dscript != null)
                         {
                             CacheDescriptionAttr[strTarget] = dscript;
                             return dscript.Description;
                         }
                     }
                 }
 
                 #endregion 3.5
             }
 
             //如果没有检测到合适的注释,则用默认名称
             return strTarget;
         }
     }

http://www.cnblogs.com/sweetWinne/p/4012135.html