/// <summary> /// 强制将指定名称的设置项从底层文件系统迁移到设置集缓存中。 /// </summary> /// <typeparam name="T">设置项内容的类型。</typeparam> /// <param name="name">要加载的设置项名称。</param> /// <returns>一个 bool 值,该值指示加载操作是否成功。</returns> /// <exception cref="ArgumentNullException"/> /// <remarks> /// 如果指定的设置项已经处于设置集缓存中,设置集缓存中的数据将被覆盖。 /// </remarks> private bool Load <T>(string name) { if (name == null) { throw new ArgumentNullException(nameof(name)); } string filename = MakeFilename(name); if (!File.Exists(filename)) { // 底层文件系统不存在目标文件。 return(false); } // 尝试读取目标文件内容。 string content = string.Empty; try { content = File.ReadAllText(filename); } catch { // 写入日志信息。 Log.Error("Unable to read setting file: \"{0}\".", filename); return(false); } // 将目标文件内容反序列化为对象数据。 object obj = null; try { obj = JsonConvert.DeserializeObject(content, typeof(T)); } catch { // 写入日志信息。 Log.Error("Unable to convert JSON to object data. Setting file: \"{0}\"", filename); return(false); } // 将设置项内容写入缓存中。 SettingItemInfo item = new SettingItemInfo(obj, typeof(T)); if (m_settingsCache.ContainsKey(name)) { // 指定设置项已经处于设置集缓存中。执行覆盖。 m_settingsCache[name] = item; } else { m_settingsCache.Add(name, item); } return(true); }
/// <summary> /// 将指定名称的设置项修改为指定的内容。 /// </summary> /// <typeparam name="T">设置项内容的类型。</typeparam> /// <param name="name">欲修改的设置项的名称。</param> /// <param name="value">设置项的新内容。</param> /// <exception cref="ArgumentNullException"/> /// <exception cref="InvalidOperationException"/> /// <exception cref="IOException"/> public void Set <T>(string name, T value) { if (name == null) { throw new ArgumentNullException(nameof(name)); } if (!m_settingsCache.ContainsKey(name)) { // 检查底层文件系统。 string filename = MakeFilename(name); if (!File.Exists(filename)) { throw new InvalidOperationException("指定的设置项不存在于当前的设置集中。"); } if (!Load <T>(name)) { throw new IOException("访问底层文件系统时出现错误。"); } } // 更新缓存数据。 SettingItemInfo info = m_settingsCache[name]; info.Value = value; info.ValueType = typeof(T); m_dirty = true; }