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