读取 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>
我正在编写一个 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>