You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写string类型扩展方法读取字符串常量对应的Description属性值

结论

这个需求无法直接通过你预期的Days.Mon.ToName()调用形式实现,核心原因如下:

原因说明

  1. 枚举的扩展方法能生效,是因为枚举值本身在运行时携带了完整的类型、成员身份信息,调用ToName时可以通过反射直接拿到对应枚举成员上标注的特性。
  2. 而你定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:06:10