Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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;
        }