Si no te importa la piratería alrededor del marco y se puede suponer razonablemente que la versión de .NET Framework se ejecuta la aplicación en (es decir, se trata de una aplicación web o una aplicación de intranet), entonces usted podría intentar algo como esto:
using System;
using System.Collections.Specialized;
using System.Configuration;
using System.Configuration.Internal;
using System.Reflection;
static class ConfigOverrideTest
{
sealed class ConfigProxy:IInternalConfigSystem
{
readonly IInternalConfigSystem baseconf;
public ConfigProxy(IInternalConfigSystem baseconf)
{
this.baseconf = baseconf;
}
object appsettings;
public object GetSection(string configKey)
{
if(configKey == "appSettings" && this.appsettings != null) return this.appsettings;
object o = baseconf.GetSection(configKey);
if(configKey == "appSettings" && o is NameValueCollection)
{
// create a new collection because the underlying collection is read-only
var cfg = new NameValueCollection((NameValueCollection)o);
// add or replace your settings
cfg["test"] = "Hello world";
o = this.appsettings = cfg;
}
return o;
}
public void RefreshConfig(string sectionName)
{
if(sectionName == "appSettings") appsettings = null;
baseconf.RefreshConfig(sectionName);
}
public bool SupportsUserConfig
{
get { return baseconf.SupportsUserConfig; }
}
}
static void Main()
{
// initialize the ConfigurationManager
object o = ConfigurationManager.AppSettings;
// hack your proxy IInternalConfigSystem into the ConfigurationManager
FieldInfo s_configSystem = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.Static | BindingFlags.NonPublic);
s_configSystem.SetValue(null, new ConfigProxy((IInternalConfigSystem)s_configSystem.GetValue(null)));
// test it
Console.WriteLine(ConfigurationManager.AppSettings["test"] == "Hello world" ? "Success!" : "Failure!");
}
}
reflexión privada ... muy travieso. –
¿qué tiene que ver específicamente la versión .net framework con el ejemplo anterior? Es decir, estoy probando un ejemplo similar, pero aunque SetValue parece estar estableciendo el valor, al final, al tratar de recuperar la configuración falla, entonces, ¿en qué casos el código anterior podría no funcionar? gracias –
El campo privado 's_configSystem' es un detalle de implementación de' ConfigurationManager' y podría cambiar en una futura versión del framework o podría no existir en absoluto (por ejemplo, mono tiene un campo llamado [configSystem] (https: // github. com/mono/mono/blob/effa4c07ba850bedbe1ff54b2a5df281c058ebcb/mcs/class/System.Configuration/System.Configuration/ConfigurationManager.cs # L48). –