是否可以通过使用反射来调整只读属性来使应用程序设置可编辑

本文关键字:应用程序 设置 编辑 只读属性 调整 反射 是否 可以通过 | 更新日期: 2023-09-27 17:59:36

我找到了以下代码将 ConfigurationManager.ConnectionStrings 属性的只读属性设置为 false:

    typeof(ConfigurationElementCollection)
        .GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
        .SetValue(ConfigurationManager.ConnectionStrings, false);

是否可以应用它以使AppSettings属性也可编辑?

AppSettings 是一个实现具有 IsReadOnly 属性NameObjectCollectionBaseNameValueCollection。但是,如果我调用GetFields()它会返回一个空列表。

编辑:

我正在尝试做的是在单元测试中修改我的应用程序设置,然后执行一个将从应用程序设置中读取并执行某些功能的方法。

因此,任何允许我更改内存中的应用程序设置(但不将它们保存到磁盘(的选项都可以。理想情况下,无需回收应用池。

它适用于连接字符串,但我无法使用相同的技术编辑应用程序设置。

是否可以通过使用反射来调整只读属性来使应用程序设置可编辑

如果您只想更新*.config文件AppSettings部分中的设置,然后保留它,下面的代码应该可以解决问题。

private void UpdateSetting(string key, string value)
{
    var configuration = ConfigurationManager
       .OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
    configuration.AppSettings.Settings[key].Value = value;
    configuration.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection("appSettings");
    // Now we need to update the setting in memory as well
    UpdateSettingInMemory(key, value);
}
private void UpdateSettingInMemory(string key, string value)
{
    var configuration = ConfigurationManager
        .OpenExeConfiguration(ConfigurationUserLevel.None);
    configuration.AppSettings.Settings[key].Value = value;
    configuration.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection("appSettings");
}

根据参考源,底层字段被命名为 _readOnly ,因此使用正确的BindingFlags,让这个字段更改其值应该没有问题。

或者,您可以获取 IsReadOnly 属性并通过调用 setter 方法或使用 SetValue 快捷方式来更改其值。