zoukankan      html  css  js  c++  java
  • C# Enum 添加自定义Attribute,然后通过泛型与反射的方式得到事先定义的标记



    这是测试用的代码,
            private void button3_Click(object sender, EventArgs e)
            {
                foreach (var v in Enum.GetValues(typeof(AwardsType)))
                {
                    object obj = FunEnum.GetCustomAttribute<AwardsType>((AwardsType)v);
    
                    EnumDescription enumDes = obj as EnumDescription;
                    if (enumDes != null)
                    {
                        Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff")
                            + "    DisplayText=" + enumDes.DisplayText
                            + ",  DisplayTextEx=" + enumDes.DisplayTextEx);
                    }
                }
    
    
                foreach (var v in Enum.GetValues(typeof(AwardsType)))
                {
                    object obj = FunEnum.GetCustomAttribute<AwardsType>((AwardsType)v);
    
                    EnumDescription enumDes = obj as EnumDescription;
                    if (enumDes != null)
                    {
                        Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff")
                            + "    DisplayText=" + enumDes.DisplayText
                            + ",  DisplayTextEx=" + enumDes.DisplayTextEx);
                    }
                }
    
            }
    

      


      



    以下为定义的类与静态函数
    namespace WindowsFormsApplication1
    {
        public enum AwardsType
        {
            [EnumDescription(DisplayText = "世界级", DisplayTextEx = "AA")]
            World = 1,
    
            [EnumDescription(DisplayText = "国家级", DisplayTextEx = "BB")]
            Country = 2,
    
            [EnumDescription(DisplayText = "省市级", DisplayTextEx = "CC")]
            Provinces = 3,
    
            [EnumDescription(DisplayText = "校级", DisplayTextEx = "DD")]
            School = 4,
        };
    
        [AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
        public class EnumDescription : Attribute
        {
            public string DisplayText;
    
            public string DisplayTextEx;
        }
    
    
        public static class FunEnum
        {
            // 此处做一个dictionary,这样原则上每个enum只要反射一次就可以得到想要的值
            static Dictionary<string, object> dictEnum = new Dictionary<string, object>();
    
            public static object GetCustomAttribute<T>(T t) where T : struct
            {
                Type enumType = t.GetType();
    
                if (!enumType.IsEnum)
                {
                    return null;
                }
    
                string sKey = enumType.ToString() + "." + t.ToString();
    
                if (!dictEnum.ContainsKey(sKey))
                {
                    FieldInfo[] infos = enumType.GetFields();
    
                    foreach (FieldInfo fi in infos)
                    {
                        string sTempKey = enumType.ToString() + "." + fi.GetValue(t);
                        Debug.WriteLine("sTempKey= " + sTempKey);
    
                        if (dictEnum.ContainsKey(sTempKey)) continue;
    
                        object[] eds = fi.GetCustomAttributes(true);
    
                        if (eds != null && eds.Length > 0)
                        {
                            dictEnum.Add(sTempKey, eds[0]);
                        }
                        else
                        {
                            dictEnum.Add(sTempKey, null);
                        }
                    }
                }
    
    
                if (dictEnum.ContainsKey(sKey))
                {
                    return dictEnum[sKey];
                }
                else
                {
                    return null;
                }
    
            }
    
        }
    }
    

      

      

  • 相关阅读:
    Eclipse显示行号
    Eclipse中让Scala缩进变为4
    阿里云Maven仓库
    Eclipse格式化整个项目
    Spring拦截器
    Spring配置redis及使用
    Java加密数据库
    Eclipce远程调试
    服务器部署Java Web及微信开发调试
    基本MVC2模式创建新闻网站
  • 原文地址:https://www.cnblogs.com/LongHuaiYu/p/9837794.html
Copyright © 2011-2022 走看看