C# 配置部分赢得';t转换为NameValueCollection

C# 配置部分赢得';t转换为NameValueCollection,c#,configuration,config,C#,Configuration,Config,我的控制台应用程序(.NET 4.5.2)中有这个Q1.config文件 这很好: string globalValue = config.AppSettings.Settings["globalKey"].Value; 但我如何获得“验证密钥”?我试过这些,但不起作用: validationSettings["validationKey"] validationSettings.Settings["validationKey"] (config.GetSection("validations

我的控制台应用程序(.NET 4.5.2)中有这个
Q1.config
文件

这很好:

string globalValue = config.AppSettings.Settings["globalKey"].Value;
但我如何获得“验证密钥”?我试过这些,但不起作用:

validationSettings["validationKey"]
validationSettings.Settings["validationKey"]
(config.GetSection("validations") as NameValueCollection)["validationKey"]
给你

您的XML配置

<configuration>
  <configSections>
   <section name="validations" type="System.Configuration.AppSettingsSection" />
  </configSections>
 <startup>
   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
 </startup>
 <appSettings>
   <add key="globalKey" value="globalValue" />
 </appSettings>
 <validations>
   <add key="validationKey" value="validationValue"/>
 </validations>
</configuration>
我在这里使用了一个索引
validationSettings[0]
来访问该值。您可以使用密钥获取值


感谢@Karthik的回答,我遇到了一个问题。。。如果我使用
ConfigurationManager.GetSection()
我只得到null。要获取节,我必须使用
OpenMappedExeConfiguration
返回的config对象。但是,config中的GetSection()不是ConfigurationManager中的类型
object
,而是
DefaultSection
,我无法从中读取键值对,也无法将其转换为
NameValueCollection
。在网上浏览我找到了一个适合我的解决方案

基本上,从节中提取XML并使用XmlDoc手动解析它

public static NameValueCollection GetSectionSettings(string sectionToRead, string configPath)
{
    if (!File.Exists(configPath)) { throw new ArgumentException($"File not found: {configPath}", nameof(configPath)); }

    var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = configPath };
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

    string settingsXml = config.GetSection(sectionToRead).SectionInformation.GetRawXml();
    XmlDocument settingsXmlDoc = new XmlDocument();
    settingsXmlDoc.Load(new StringReader(settingsXml));
    NameValueSectionHandler handler = new NameValueSectionHandler();

    return handler.Create(null, null, settingsXmlDoc.DocumentElement) as NameValueCollection;
}

有没有可能这个代码已经过时了?当我使用
ConfigurationManager.GetSection
时,我只会得到null,要获得该节,我必须使用
OpenMappedExeConfiguration
返回的
config
对象。但是,config中的GetSection不是ConfigurationManager中的类型
object
,而是
DefaultSection
,我无法从中读取键值对,也无法将其转换为
NameValueCollection
<configuration>
  <configSections>
   <section name="validations" type="System.Configuration.AppSettingsSection" />
  </configSections>
 <startup>
   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
 </startup>
 <appSettings>
   <add key="globalKey" value="globalValue" />
 </appSettings>
 <validations>
   <add key="validationKey" value="validationValue"/>
 </validations>
</configuration>
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = "Q1.config" };

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

NameValueCollection validationSettings = (NameValueCollection)ConfigurationManager.GetSection("validations");

string globalValue = validationSettings[0];
public static NameValueCollection GetSectionSettings(string sectionToRead, string configPath)
{
    if (!File.Exists(configPath)) { throw new ArgumentException($"File not found: {configPath}", nameof(configPath)); }

    var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = configPath };
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

    string settingsXml = config.GetSection(sectionToRead).SectionInformation.GetRawXml();
    XmlDocument settingsXmlDoc = new XmlDocument();
    settingsXmlDoc.Load(new StringReader(settingsXml));
    NameValueSectionHandler handler = new NameValueSectionHandler();

    return handler.Create(null, null, settingsXmlDoc.DocumentElement) as NameValueCollection;
}