.net - existe - ¿Cómo obtengo los valores de una ConfigSection definida como NameValueSectionHandler cuando uso ConfigurationManager.OpenMappedExeConfiguration?
system configuration vb net (1)
Me encontré con mi propia respuesta de hace dos años.
NameValueSectionHandler: ¿puedo usar este tipo de sección para volver a escribir en el archivo de configuración de la aplicación?
Este es mi enfoque para resolver mi problema actual.
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap() {
ExeConfigFilename = "path to config here"
};
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
configFileMap, ConfigurationUserLevel.None);
ConfigurationSection myParamsSection = config.GetSection("MyParams");
string myParamsSectionRawXml = myParamsSection .SectionInformation.GetRawXml();
XmlDocument sectionXmlDoc = new XmlDocument();
sectionXmlDoc.Load(new StringReader(myParamsSectionRawXml ));
NameValueSectionHandler handler = new NameValueSectionHandler();
NameValueCollection handlerCreatedCollection =
handler.Create(null, null, sectionXmlDoc.DocumentElement) as NameValueCollection;
Console.WriteLine(handlerCreatedCollection.Count);
Un método que funciona con cualquiera de los tipos anteriores de IConfigurationSectionHandler NameValueSectionHandler, DictionarySectionHandler, SingleTagSectionHandler.
public static object GetConfigurationValues(string configFileName, string sectionName)
{
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap() { ExeConfigFilename = configFileName };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
ConfigurationSection section = config.GetSection(sectionName);
string xml = section.SectionInformation.GetRawXml();
XmlDocument doc = new XmlDocument();
doc.Load(XmlReader.Create(new StringReader(xml)));
string type = section.SectionInformation.Type;
string assemblyName = typeof(IConfigurationSectionHandler).Assembly.GetName().FullName;
ObjectHandle configSectionHandlerHandle = Activator.CreateInstance(assemblyName, section.SectionInformation.Type);
if (configSectionHandlerHandle != null)
{
IConfigurationSectionHandler handler = configSectionHandlerHandle.Unwrap() as IConfigurationSectionHandler;
return handler.Create(null, null, doc.DocumentElement);
}
return null;
}
Obtener los valores de un archivo de configuración que usa una sección definida por System.Configuration.NameValueSectionHandler es fácil cuando está usando el archivo de configuración actual para la aplicación.
Ejemplo de archivo de configuración.
<configuration>
<configSections>
<section name="MyParams" type="System.Configuration.NameValueSectionHandler" />
</configSections>
<MyParams>
<add key="FirstParam" value="One"/>
<add key="SecondParam" value="Two"/>
</MyParams>
</configuration>
Código de ejemplo que lo lee fácilmente.
NameValueCollection myParamsCollection =
ConfigurationManager.GetSection("MyParams") as NameValueCollection;
Este es el código que no funciona.
NameValueCollection collection =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.GetSection("MyParams") as NameValueCollection;
Eso falla con el siguiente error en la compilación.
No se puede convertir el tipo ''System.Configuration.ConfigurationSection'' a ''System.Collections.Specialized.NameValueCollection'' a través de una conversión de referencia, conversión de boxeo, conversión de unboxing, conversión de envoltura o conversión de tipo nulo.
ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None) devuelve System.Configuration.Configuration y Configuration.GetSection devuelve ConfigurationSection.
ConfigurationManager.GetSection devuelve el objeto.
Entonces, ¿cómo recupero mi NameValueCollection cuando tengo que usar OpenExeConfiguration?