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

如何通过Getter和Setter实现Dictionary<string,string>并处理键不存在问题

解决方案:给静态本地化字典实现自定义Getter/Setter(键不存在返回键本身)

没问题,针对你的本地化静态字典需求,我给你两个实用的实现方案,完美解决Getter不抛异常、返回键本身的问题,同时保留Setter的正常功能~


方案1:封装静态字典,实现自定义索引器(推荐)

这种方式通过一个静态类封装字典,对外暴露类似属性的索引器,既符合封装原则,又能完全控制Getter和Setter的行为。

代码实现

public static class LocalizationManager
{
    // 私有静态字典,对外隐藏实现细节
    private static readonly Dictionary<string, string> _localizationStore = new Dictionary<string, string>();
    // 多线程环境下建议加锁,避免并发问题
    private static readonly object _lockObj = new object();

    // 自定义索引器,模拟属性的Getter/Setter
    public static string this[string key]
    {
        get
        {
            if (string.IsNullOrEmpty(key))
                return key; // 处理空键的边界情况

            lock (_lockObj)
            {
                // TryGetValue安全获取,不存在则返回key本身
                return _localizationStore.TryGetValue(key, out string localizedValue) 
                    ? localizedValue 
                    : key;
            }
        }
        set
        {
            if (string.IsNullOrEmpty(key))
                return; // 空键不处理

            lock (_lockObj)
            {
                // Setter逻辑:存在则覆盖,不存在则添加
                _localizationStore[key] = value;
            }
        }
    }
}

使用方式

// 设置本地化值
LocalizationManager["WelcomeMessage"] = "欢迎使用本应用!";
LocalizationManager["ExitPrompt"] = "确定要退出吗?";

// 获取本地化值(键不存在时直接返回键本身)
var welcomeText = LocalizationManager["WelcomeMessage"]; // 返回"欢迎使用本应用!"
var missingText = LocalizationManager["NonExistingKey"]; // 返回"NonExistingKey"

方案2:给现有字典扩展自定义Get方法(灵活适配已有代码)

如果你的项目中已经存在静态字典,不想重构为新类,可以通过扩展方法给Dictionary添加一个安全的Get方法,Setter直接使用原生字典的索引器即可(原生Setter不会抛异常,不存在的键会自动添加)。

代码实现

public static class DictionaryLocalizationExtensions
{
    /// <summary>
    /// 安全获取本地化值,键不存在时返回键本身
    /// </summary>
    public static string GetLocalized(this Dictionary<string, string> dict, string key)
    {
        if (dict == null || string.IsNullOrEmpty(key))
            return key;

        // 多线程环境下建议加锁,或者使用ConcurrentDictionary
        return dict.TryGetValue(key, out string value) ? value : key;
    }
}

使用方式

假设你的现有静态字典是:

public static Dictionary<string, string> AppLocalization = new Dictionary<string, string>();

那么使用起来就是:

// 设置值(用原生索引器即可)
AppLocalization["Hello"] = "你好";

// 获取值(用扩展方法)
var helloText = AppLocalization.GetLocalized("Hello"); // 返回"你好"
var missingKeyText = AppLocalization.GetLocalized("MissingKey"); // 返回"MissingKey"

额外注意点

  • 线程安全:如果你的应用是多线程环境(比如Web应用、后台服务),一定要加锁或者直接使用ConcurrentDictionary来替代普通Dictionary,避免并发读写导致的异常。
  • 边界处理:上面的代码都加入了空键的判断,避免传入null或空字符串时出现问题,你可以根据自己的需求调整这部分逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:22:01