gpt4 book ai didi

.net - 使用ConfigurationManager.OpenMappedExeConfiguration时如何从定义为NameValueSectionHandler的ConfigSection中获取值

转载 作者:行者123 更新时间:2023-12-04 17:23:58 27 4
gpt4 key购买 nike

当您为应用程序使用当前配置文件时,从使用System.Configuration.NameValueSectionHandler定义的部分的配置文件中获取值很容易。

示例配置文件。

<configuration>
<configSections>
<section name="MyParams" type="System.Configuration.NameValueSectionHandler" />
</configSections>

<MyParams>
<add key="FirstParam" value="One"/>
<add key="SecondParam" value="Two"/>
</MyParams>
</configuration>

易于阅读的示例代码。
NameValueCollection myParamsCollection =
ConfigurationManager.GetSection("MyParams") as NameValueCollection;

这是无效的代码。
NameValueCollection collection =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.GetSection("MyParams") as NameValueCollection;

失败,并在编译时出现以下错误。

无法通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换将类型“System.Configuration.ConfigurationSection”转换为“System.Collections.Specialized.NameValueCollection”。

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)返回System.Configuration.Configuration,Configuration.GetSection返回ConfigurationSection。

ConfigurationManager.GetSection返回对象。

因此,当我必须使用OpenExeConfiguration时如何取回NameValueCollection?

最佳答案

我遇到了两年前的回答。

NameValueSectionHandler - can i use this section type for writing back to the application config file?

这是我解决当前问题的方法。

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);

与任何旧版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;
}

关于.net - 使用ConfigurationManager.OpenMappedExeConfiguration时如何从定义为NameValueSectionHandler的ConfigSection中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13825323/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com