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;
            }

        }

    }
}

  

  

原文地址:https://www.cnblogs.com/LongHuaiYu/p/9837794.html