代码之家  ›  专栏  ›  技术社区  ›  Evgeny

C AppSettingsReader:“重新读取”值到AppSettingsReader中(运行时)?

  •  0
  • Evgeny  · 技术社区  · 17 年前

    在我的应用程序中,我需要在运行时更改app.config的appsetting中的一些值(“environment”)。

    我使用AppSettingsReader

        private static AppSettingsReader _settingReader;
    
        public static AppSettingsReader SettingReader
        {
            get 
            {
                if (_settingReader == null)
                {
                    _settingReader = new AppSettingsReader();
                }
                return _settingReader; 
            }
        }
    

    在某个阶段我会这样做

            config.AppSettings.Settings[AppSettingString.Environment.ToString()].Value = newEnvironment.ToString();
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");  
    

    但是,下次我试着读这样的“环境”时

           string environment = (string)SettingReader.GetValue(AppSettingString.Environment.ToString(), typeof(System.String));
    

    我最终得到了旧的环境价值观。

    我注意到我可以通过这样做来解决这个问题

    _settingReader = new AppSettingsReader();
    

    在我读“环境”之前。

    但是我认为创建一个新实例不是正确的方法。

    也许有一种方法可以让我的settingreader知道,值已更改为使用它的同一实例,但具有刷新的值?

    (显然不是一个破坏项目的问题,更像是一个教育问题)

    3 回复  |  直到 14 年前
        1
  •  1
  •   Gishu    17 年前

    AppSettingsReader似乎没有从磁盘重新加载的方法。它只是从对象派生的。创建一个新实例似乎是唯一可行的方法…我可能错了,但AppSettings应该是您的应用程序的只读值。更像是应用程序的配置参数,可以在启动前进行调整。

    对于读写应用程序设置,我认为具有IDE支持的设置机制( System.Configuration.ApplicationSettingsBase )将是首选的方法。这有保存和 Reload 方法。designer gen类也使代码更具可读性。
    在解决方案资源管理器中双击项目下的“属性”节点。找到“设置”选项卡。

    而不是

    sEnvironment = (string)SettingReader.GetValue(AppSettingString.Environment.ToString(), typeof(System.String));
    

    您可以有如下类型的属性

    sEnvironment = Properties.Settings.Default.Environment;
    

    设计器生成的类通过默认属性公开同步的单实例。这意味着你不需要重新加载……您总是能在应用程序中获得最新的值。

        2
  •  0
  •   Locutus    17 年前

    升级是您正在寻找的功能

    System.Configuration.ApplicationSettingsBase.Upgrade
    
        3
  •  0
  •   Lloyd Powell binku    14 年前
    System.Configuration.ApplicationSettingsBase.Reload