是否可以通过使用反射来调整只读属性来使应用程序设置可编辑
本文关键字:应用程序 设置 编辑 只读属性 调整 反射 是否 可以通过 | 更新日期: 2023-09-27 17:59:36
我找到了以下代码将 ConfigurationManager.ConnectionStrings
属性的只读属性设置为 false:
typeof(ConfigurationElementCollection)
.GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(ConfigurationManager.ConnectionStrings, false);
是否可以应用它以使AppSettings
属性也可编辑?
AppSettings 是一个实现具有 IsReadOnly
属性NameObjectCollectionBase
的NameValueCollection
。但是,如果我调用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
快捷方式来更改其值。