using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; namespace System.ComponentModel { /// <summary> /// 获取自定义属性 /// <code> /// CDescriptionHelper.Example.Debug(); /// </code> /// </summary> public static class CDescriptionHelper { public class Example { [Description("(1).CustomClass->Description")] [DisplayName("(1).CustomClass->DisplayName")] public class CustomClass { [Description("(1.1).CustomClass->CustomFiledString->Description")] [DisplayName("(1.1).CustomClass->CustomFiledString->DisplayName")] public string CustomFiledString { get; set; } = ""; [Description("(1.2).CustomClass->CustomFiledBoolean->Description")] [DisplayName("(1.2).CustomClass->CustomFiledBoolean->DisplayName")] public bool CustomFiledBoolean { get; set; } = true; } [Description("(2).CustomStruct->Description")] public struct CustomStruct { [Description("(2.1).CustomStruct->CustomFiledString->Description")] public string CustomFiledString; [Description("(2.2).CustomStruct->CustomFiledBoolean->Description")] public bool CustomFiledBoolean; } [Description("(3).CustomEnum->Description")] public enum CustomEnum { [Description("(3.1).CustomEnum->CustomEnumZero->Description")] CustomEnumZero, [Description("(3.2).CustomEnum->CustomEnumFirst->Description")] CustomEnumFirst, } public static void Debug() { // 类 Console.WriteLine(typeof(CustomClass).CustomAttribute<CustomClass, DescriptionAttribute>()); Console.WriteLine(typeof(CustomClass).CustomAttribute<CustomClass, DisplayNameAttribute>()); Console.WriteLine(nameof(CustomClass.CustomFiledString).CustomAttribute<CustomClass, DescriptionAttribute>()); Console.WriteLine(nameof(CustomClass.CustomFiledString).CustomAttribute<CustomClass, DisplayNameAttribute>()); Console.WriteLine(nameof(CustomClass.CustomFiledBoolean).CustomAttribute<CustomClass, DescriptionAttribute>()); Console.WriteLine(nameof(CustomClass.CustomFiledBoolean).CustomAttribute<CustomClass, DisplayNameAttribute>()); // 结构体 Console.WriteLine(typeof(CustomStruct).CustomAttribute<CustomStruct, DescriptionAttribute>()); Console.WriteLine(nameof(CustomStruct.CustomFiledString).CustomAttribute<CustomStruct, DescriptionAttribute>()); Console.WriteLine(nameof(CustomStruct.CustomFiledBoolean).CustomAttribute<CustomStruct, DescriptionAttribute>()); // 枚举 Console.WriteLine(typeof(CustomEnum).CustomAttribute<CustomEnum, DescriptionAttribute>()); Console.WriteLine(nameof(CustomEnum.CustomEnumZero).CustomAttribute<CustomEnum, DescriptionAttribute>()); Console.WriteLine(nameof(CustomEnum.CustomEnumFirst).CustomAttribute<CustomEnum, DescriptionAttribute>()); } } /// <summary> /// 获取"自定义的class|struct|enum"的自定义属性 /// </summary> /// <typeparam name="T">自定义的class|struct|enum</typeparam> /// <typeparam name="U">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <param name="src"></param> /// <returns></returns> public static string CustomAttribute<T,U>(this Type src) { if(src.IsClass) { return AttributeDescription<T, U>(); } else if (src.IsEnum) { return TypeCustomAttribute<T, U>(); } else { return TypeCustomAttribute<T, U>(); } } /// <summary> /// 获取"自定义的class|struct|enum"成员的自定义属性 /// </summary> /// <typeparam name="T">自定义的class|struct|enum</typeparam> /// <typeparam name="U">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <param name="src">T 成员变量名</param> /// <returns></returns> public static string CustomAttribute<T, U>(this string src) { Type tp = typeof(T); if (tp.IsClass) { return PropertyDescription<T, U>(src); } else if (tp.IsEnum) { return TypeFieldCustomAttribute<T, U>(src); } else { return TypeFieldCustomAttribute<T, U>(src); } } /// <summary> /// /// </summary> /// <typeparam name="T">自定义的class|struct|enum</typeparam> /// <typeparam name="U">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <returns></returns> private static string TypeCustomAttribute<T,U>() { foreach (var item in typeof(T).GetCustomAttributes(false)) { if (item.GetType() == typeof(DescriptionAttribute) && typeof(U) == typeof(DescriptionAttribute)) { DescriptionAttribute da = (DescriptionAttribute)item; return da.Description; } else if (item.GetType() == typeof(DisplayNameAttribute) && typeof(U) == typeof(DisplayNameAttribute)) { DisplayNameAttribute da = (DisplayNameAttribute)item; return da.DisplayName; } else if (item.GetType() == typeof(CategoryAttribute) && typeof(U) == typeof(CategoryAttribute)) { CategoryAttribute da = (CategoryAttribute)item; return da.Category; } } return ""; } /// <summary> /// /// </summary> /// <typeparam name="T">自定义的class|struct|enum</typeparam> /// <typeparam name="U">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <param name="name">成员变量名</param> /// <returns></returns> private static string TypeFieldCustomAttribute<T,U>(string name) { foreach (FieldInfo item in typeof(T).GetFields()) { // item.Name == nameof(TempE.Curve3) if (item.Name != name) continue; foreach (var item2 in item.GetCustomAttributes(false)) { if (item2.GetType() == typeof(DescriptionAttribute) && typeof(U) == typeof(DescriptionAttribute)) { DescriptionAttribute da = (DescriptionAttribute)item2; return da.Description; } else if (item2.GetType() == typeof(DisplayNameAttribute) && typeof(U) == typeof(DisplayNameAttribute)) { DisplayNameAttribute da = (DisplayNameAttribute)item2; return da.DisplayName; } else if (item.GetType() == typeof(CategoryAttribute) && typeof(U) == typeof(CategoryAttribute)) { CategoryAttribute da = (CategoryAttribute)item2; return da.Category; } } } return ""; } /// <summary> /// /// </summary> /// <typeparam name="T">自定义的class|struct|enum</typeparam> /// <typeparam name="U">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <param name="name">成员变量名</param> /// <returns></returns> private static string PropertyDescription<T,U>(string name) { PropertyDescriptorCollection attributes = null; attributes = TypeDescriptor.GetProperties(typeof(T)); return GetValue<U>(attributes, name); } /// <summary> /// /// </summary> /// <typeparam name="T">自定义的class|struct|enum</typeparam> /// <typeparam name="U">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <returns></returns> public static string AttributeDescription<T,U>() { AttributeCollection attributes = null; attributes = TypeDescriptor.GetAttributes(typeof(T)); return GetValue<U>(attributes); } /// <summary> /// /// </summary> /// <typeparam name="T">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <param name="properties"></param> /// <param name="name">成员变量名</param> /// <returns></returns> private static string GetValue<T>(PropertyDescriptorCollection properties, string name) { foreach (var item in properties) { PropertyDescriptor pd = item as PropertyDescriptor; if (pd == null) { continue; } if(name == pd.Name) { if ( typeof(T) == typeof(DescriptionAttribute)) { return pd.Description; } else if (typeof(T) == typeof(DisplayNameAttribute)) { return pd.DisplayName; } else if (typeof(T) == typeof(CategoryAttribute)) { return pd.Category; } return pd.Description; } } return ""; } /// <summary> /// /// </summary> /// <typeparam name="T">DescriptionAttribute|DisplayNameAttribute|CategoryAttribute</typeparam> /// <param name="attributes"></param> /// <returns></returns> private static string GetValue<T>(AttributeCollection attributes) { foreach (var item in attributes) { if (item.GetType() == typeof(DescriptionAttribute) && typeof(T) == typeof(DescriptionAttribute)) { DescriptionAttribute da = (DescriptionAttribute)item; return da.Description; } else if (item.GetType() == typeof(DisplayNameAttribute) && typeof(T) == typeof(DisplayNameAttribute)) { DisplayNameAttribute da = (DisplayNameAttribute)item; return da.DisplayName; } else if (item.GetType() == typeof(CategoryAttribute) && typeof(T) == typeof(CategoryAttribute)) { CategoryAttribute da = (CategoryAttribute)item; return da.Category; } } return ""; } } }
(1).CustomClass->Description (1).CustomClass->DisplayName (1.1).CustomClass->CustomFiledString->Description (1.1).CustomClass->CustomFiledString->DisplayName (1.2).CustomClass->CustomFiledBoolean->Description (1.2).CustomClass->CustomFiledBoolean->DisplayName (2).CustomStruct->Description (2.1).CustomStruct->CustomFiledString->Description (2.2).CustomStruct->CustomFiledBoolean->Description (3).CustomEnum->Description (3.1).CustomEnum->CustomEnumZero->Description (3.2).CustomEnum->CustomEnumFirst->Description
【C#-WinForm(0)】获取Class、Struct、Enum主体及成员的自定义属性
原文:https://www.cnblogs.com/chenlu5201314/p/14595886.html