首页 > 编程语言 > 详细

【C#-WinForm(0)】获取Class、Struct、Enum主体及成员的自定义属性

时间:2021-03-30 13:09:21      阅读:22      评论:0      收藏:0      [点我收藏+]
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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!