读取 ConfigurationSection

Reading a ConfigurationSection

我正在编写一个 Windows 服务,它需要来自 app.config 的一些信息 - 我知道我可以使用 AppSettings,但我想稍微了解一下配置部分更好。

我修改了我的 App.Config:

<configuration>
  <startup>
    <supportedRuntime sku=".NETFramework,Version=v4.0"
                      version="v4.0"/>
  </startup>

  <configSections>
    <section name="config"
             type="MyNamespace.MyConfigurationSection"/>
  </configSections>

  <config aNumber="1"
          aBoolean="false"/>

</configuration>

并创建了以下 class:

public sealed class MyConfigurationSection : ConfigurationSection
{
    [ConfigurationProperty("aNumber", DefaultValue = 1, IsRequired = false)]
    public int Number
    {
        get { return (int) this["aNumber"]; }
        set { this["aNumber"] = value; }
    }

    [ConfigurationProperty("aBoolean", DefaultValue = false, IsRequired = false)]
    public bool Boolean
    {
        get { return (bool) this["aBoolean"]; }
        set { this["aBoolean"] = value; }
    }
}

我正在尝试像这样访问它:

public MyConfigurationSection ConfigSection
{
    get
    {
        var configurationSection = Configuration.GetSection("config");
        return (MyConfigurationSection) configurationSection;
    }
}

private static Configuration Configuration
{
    get { return ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); }
}

一切正常,直到我进入 (MyConfigurationSection) configurationSection 演员表。我从对 GetSection() 的调用中返回一个 DefaultSection,并且转换失败。

我哪里误入歧途了?

可能,虽然没有检查,

type="MyNamespace.MyConfigurationSection"/>

应该是

type="<Namespace.ClassName>,<Namespace>"/>

config 是一个保留字,不能用于配置部分的名称。您也不应该将变量命名为 Boolean。

尝试以下示例:

using System.Configuration;

namespace ConfigSectionSample
{
    internal class MyConfigurationSection : ConfigurationSection
    {
        public static MyConfigurationSection Current
        {
            get
            {
                return (MyConfigurationSection)ConfigurationManager.GetSection("myConfig");
            }
        }

        [ConfigurationProperty("aNumber", IsRequired = true)]
        public int Number
        {
            get
            {
                return (int)this["aNumber"];
            }
        }

        [ConfigurationProperty("aBoolean", IsRequired = true)]
        public bool Boolean
        {
            get
            {
                return (bool)this["aBoolean"];
            }
        }
    }
}

使用以下应用程序,配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="myConfig" type="ConfigSectionSample.MyConfigurationSection, ConfigSectionSample"></section>
  </configSections>

  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>

  <myConfig aNumber="1" aBoolean="false" />
</configuration>

并获取这样的值:

        Console.WriteLine("Number: " + MyConfigurationSection.Current.Number);
        Console.WriteLine("Boolean: " + MyConfigurationSection.Current.Boolean);
        Console.ReadLine();

这里的问题是,您必须在 app.config 的部分配置中使用 "Namespace.ClassName, Namespace" 类型值,更重要的是,configSections 必须是 app.config 中根配置元素的第一个子元素=16=]

以下配置可能适合您:

<configuration>
      <!-- <configSections> is moved to first child of <configuration> -->
      <configSections>
        <section name="config"
                 type="MyNamespace.MyConfigurationSection, MyNamespace"/>
      </configSections>

      <config aNumber="1"
              aBoolean="false"/>

      <startup>
        <supportedRuntime sku=".NETFramework,Version=v4.0"
                          version="v4.0"/>
      </startup>
</configuration>