public static class DescriptionEx
{
/// <summary>
/// 获取DescriptionAttribute信息
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetDesc(this object obj, bool nameInstead = true)
{
object[] attr = obj.GetType().GetCustomAttributes(false);
DescriptionAttribute descAttr = (DescriptionAttribute)attr.FirstOrDefault(f => f.GetType() == typeof(DescriptionAttribute));
if (descAttr == null)
{
return obj.ToString();
}
else
{
return descAttr.Description;
}
}

/// <summary>
/// 获取类属性上方DescriptionAttribute信息
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="expr"></param>
/// <returns></returns>
public static string GetDesc<T>(this object obj, Expression<Func<T, object>> expr)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeof(T))[GetPropertyName(expr)];
//PropertyDescriptor pd = TypeDescriptor.GetProperties(typeof(T))[name];
DescriptionAttribute description = pd == null ? null : pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
return description == null ? "" : description.Description;
}

/// <summary>
/// 获取表达式调用的字段名称
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="expr"></param>
/// <returns></returns>
private static string GetPropertyName<T>(Expression<Func<T, object>> expr)
{
switch (expr.Body)
{
case MemberExpression memberExpression:
return memberExpression.Member.Name;
case UnaryExpression unaryExpression:
if (unaryExpression.Operand is MemberExpression expression)
{
return expression.Member.Name;
}

break;
default:
break;
}

return "";
}

/// <summary>
/// 获取枚举DescriptionAttribute信息
/// </summary>
/// <param name="value"></param>
/// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param>
/// <returns></returns>
public static string GetDesc(this Enum value, bool nameInstead = true)
{
Type type = value.GetType();
string name = System.Enum.GetName(type, value);
if (name == null)
{
return null;
}

FieldInfo field = type.GetField(name);
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;

if (attribute == null && nameInstead == true)
{
return name;
}
return attribute?.Description;
}
}

使用

 [TestClass]
public class DescTest
{
/// <summary>
/// 获取类上方description
/// </summary>
[TestMethod]
public void ClassDesc()
{
A a = new A();

string desc = a.GetDesc();
System.Console.WriteLine(desc);
}

/// <summary>
/// 获取对象属性description
/// </summary>
[TestMethod]
public void ObjDesc()
{
A a = new();

//string desc = a.Id.GetDescription<A>(nameof(a.Id), null);
string desc = a.Id.GetDesc<A>(f => a.Id);
System.Console.WriteLine(desc);
}

/// <summary>
/// 获取枚举description
/// </summary>
[TestMethod]
public void Enumesc()
{
string desc = TestTypeEnum.First.GetDesc();

System.Console.WriteLine(desc);
}
}

留待后查,同时方便他人