如何编写string类型扩展方法读取字符串常量对应的Description属性值
结论
这个需求无法直接通过你预期的Days.Mon.ToName()调用形式实现,核心原因如下:
原因说明
- 枚举的扩展方法能生效,是因为枚举值本身在运行时携带了完整的类型、成员身份信息,调用
ToName时可以通过反射直接拿到对应枚举成员上标注的特性。 - 而你定义的
Days.Mon是const string类型,编译器在编译阶段会直接把所有Days.Mon的引用替换成它的实际值"Hi!",运行时你拿到的就是一个普通的字符串对象,完全不持有「它来自Days类的Mon常量」这个上下文信息,自然没办法反向读取Mon常量上的Description特性。
替代实现方案
如果想要实现类似的读取效果,可以调整实现方式:
方案1:改用枚举(最推荐)
就是你已经知道的枚举加扩展方法的方案,本身就是为这种带描述的固定值场景设计的。
方案2:封装自定义值类型
public readonly struct DayValue { public string Value { get; } public string Description { get; } private DayValue(string value, string description) { Value = value; Description = description; } public static readonly DayValue Mon = new DayValue("Hi!", "Wow!"); // 其他日期同理 // 隐式转换为string,方便直接当字符串用 public static implicit operator string(DayValue d) => d.Value; }
调用方式:
// 拿描述 var desc = DayValue.Mon.Description; // 直接当字符串用 string val = DayValue.Mon;
方案3:写反射工具类按常量名读取
public static class DayHelper { public static string GetDescription(string constantName) { var field = typeof(Days).GetField(constantName); if (field == null) return constantName; var attr = field.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() as DescriptionAttribute; return attr?.Description ?? constantName; } }
调用方式:
var desc = DayHelper.GetDescription(nameof(Days.Mon));
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

