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

基于XML源的DisplayNameAttribute扩展能否在运行时更新?

问题根本原因

.NET Framework中自定义特性的实例会在对应成员(此处为模型属性)首次被反射访问时完成初始化,之后被.NET运行时全局缓存,除非应用域重启,不会重新创建特性实例。你当前的实现是在构造函数中就调用TextGetter.GetText拿到翻译值传给基类,相当于翻译值在特性第一次初始化时就被固定存储,后续XML修改自然不会触发更新。

这种场景完全可以通过修改特性实现修复,不需要全盘替换特性标注方案,也不需要做大量视图重构,修复成本远低于更换实现方案。

修复代码

不需要改动已有模型的特性标注,仅修改LocalizedDisplayNameAttribute的实现逻辑,重写DisplayName属性的Getter,每次访问时实时拉取最新翻译即可:

[AttributeUsage(AttributeTargets.Property)]
public sealed class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private readonly string _key;
    private readonly string _page;

    public LocalizedDisplayNameAttribute(string key, string page = null)
    {
        // 仅存储键参数,不提前计算翻译值
        _key = key;
        _page = page;
    }

    public override string DisplayName
    {
        get
        {
            if (string.IsNullOrWhiteSpace(_key))
                return string.Empty;
            return string.IsNullOrWhiteSpace(_page) 
                ? TextGetter.GetText(_key) 
                : TextGetter.GetText(_key, _page);
        }
    }
}

该实现下每次MVC框架读取属性显示名称时,都会实时从TextGetter拉取最新内容,只要你的TextGetter本身已经支持XML修改后返回最新值,改完特性就能立刻生效,几乎无重构成本。

可选优化

如果担心每次读取都查询XML存在性能损耗,可以给TextGetter增加内存缓存,同时监听XML文件变更,文件修改后自动清空缓存即可,兼顾性能和动态更新需求。

内容的提问来源于stack exchange,提问作者Frederik T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:27:04