(转载)在web.config和app.config文件中增加自定义配置节点
原帖地址:http://blog.csdn.net/zhoufoxcn/archive/2011/03/09/6233171.aspx
为了个人需要,仅从原帖中摘录部分内容在这里显示。
通过下面的例子说明如何自定义配置节点,以及如何定义操作类读取配置信息。在这个例子中,connfig文件中我增加了一些特有的配置,所以新增了一个自己的节点,app.config文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="SoftwareSettings" type="ImageAssistant.Configuration.SoftwareSettings, ImageAssistant" />
</configSections>
<SoftwareSettings>
<LoadSettings>
<add key="LoadBmp" value="true"/>
<add key="LoadJpg" value="true"/>
<add key="LoadGif" value="true"/>
<add key="LoadPng" value="false"/>
</LoadSettings>
<PathSettings SavePath="C:\ResizeImages\" SearchSubPath="true"/>
</SoftwareSettings>
<appSettings>
<add key="LoadBmp" value="true"/>
<add key="LoadJpg" value="true"/>
<add key="LoadGif" value="true"/>
<add key="LoadPng" value="false"/>
<add key="IncludeSubPath" value="true"/>
</appSettings>
</configuration>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="SoftwareSettings" type="ImageAssistant.Configuration.SoftwareSettings, ImageAssistant" />
</configSections>
<SoftwareSettings>
<LoadSettings>
<add key="LoadBmp" value="true"/>
<add key="LoadJpg" value="true"/>
<add key="LoadGif" value="true"/>
<add key="LoadPng" value="false"/>
</LoadSettings>
<PathSettings SavePath="C:\ResizeImages\" SearchSubPath="true"/>
</SoftwareSettings>
<appSettings>
<add key="LoadBmp" value="true"/>
<add key="LoadJpg" value="true"/>
<add key="LoadGif" value="true"/>
<add key="LoadPng" value="false"/>
<add key="IncludeSubPath" value="true"/>
</appSettings>
</configuration>
在config文件中我们使用<section name="SoftwareSettings" type="ImageAssistant.Configuration.SoftwareSettings, ImageAssistant" />告诉应用程序对于配置文件中的SoftwareSettings节点,其对应的类是ImageAssistant程序集中ImageAssistant.Configuration.SoftwareSettings类,并且在<SoftwareSettings>节点中我们还看到有<LoadSettings>节点和<PathSettings>节点,其中<LoadSettings>是一个节点集合,还包含有多个子节点,为了表示清楚这些关系我们需要添加四个类:SoftwareSettings、LoadSettingsCollection、LoadSettingsElement及PathSettingElement。为了发布方便,周公将这四个类的代码放在一个物理文件中,代码如下(注意添加对System.Configuration.dll的引用):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
//作者:zhoufoxcn(周公)
//日期:2011-03-08
//blog:http://blog.csdn.net/zhoufoxcn 或http://zhoufoxcn.blog.51cto.com
//版权声明:本文允许非商业用途,但必须保证不得去掉本文中的任何链接,违者必究。
namespace ImageAssistant.Configuration
{
public sealed class LoadSettingsCollection : ConfigurationElementCollection
{
private IDictionary<string, bool> settings;
protected override ConfigurationElement CreateNewElement()
{
return new LoadSettingsElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
LoadSettingsElement ep = (LoadSettingsElement)element;
return ep.Key;
}
protected override string ElementName
{
get
{
return base.ElementName;
}
}
public IDictionary<string, bool> Settings
{
get
{
if (settings == null)
{
settings = new Dictionary<string, bool>();
foreach (LoadSettingsElement e in this)
{
settings.Add(e.Key, e.Value);
}
}
return settings;
}
}
public bool this[string key]
{
get
{
bool isLoad = true;
if (settings.TryGetValue(key, out isLoad))
{
return isLoad;
}
else
{
throw new ArgumentException("没有对'" + key + "'节点进行配置。");
}
}
}
}
public class LoadSettingsElement : ConfigurationElement
{
[ConfigurationProperty("key", IsRequired = true)]
public string Key
{
get { return (string)base["key"]; }
set { base["key"] = value; }
}
[ConfigurationProperty("value", IsRequired = true)]
public bool Value
{
get { return (bool)base["value"]; }
set { base["value"] = value; }
}
}
public class PathSettingElement : ConfigurationElement
{
/// <summary>
///
/// </summary>
[ConfigurationProperty("SavePath", IsRequired = true)]
public string SavePath
{
get { return (string)base["SavePath"]; }
set { base["SavePath"] = value; }
}
/// <summary>
///
/// </summary>
[ConfigurationProperty("SearchSubPath", IsRequired = false, DefaultValue = true)]
public bool SearchSubPath
{
get { return (bool)base["SearchSubPath"]; }
set { base["SearchSubPath"] = value; }
}
}
/// <summary>
/// 对应config文件中的
/// </summary>
public sealed class SoftwareSettings : ConfigurationSection
{
/// <summary>
/// 对应SoftwareSettings节点下的LoadSettings子节点
/// </summary>
[ConfigurationProperty("LoadSettings", IsRequired = true)]
public LoadSettingsCollection LoadSettings
{
get { return (LoadSettingsCollection)base["LoadSettings"]; }
}
/// <summary>
/// 对应SoftwareSettings节点下的PathSettings子节点,非必须
/// </summary>
[ConfigurationProperty("PathSettings", IsRequired = false)]
public PathSettingElement PathSetting
{
get { return (PathSettingElement)base["PathSettings"]; }
set { base["PathSettings"] = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
//作者:zhoufoxcn(周公)
//日期:2011-03-08
//blog:http://blog.csdn.net/zhoufoxcn 或http://zhoufoxcn.blog.51cto.com
//版权声明:本文允许非商业用途,但必须保证不得去掉本文中的任何链接,违者必究。
namespace ImageAssistant.Configuration
{
public sealed class LoadSettingsCollection : ConfigurationElementCollection
{
private IDictionary<string, bool> settings;
protected override ConfigurationElement CreateNewElement()
{
return new LoadSettingsElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
LoadSettingsElement ep = (LoadSettingsElement)element;
return ep.Key;
}
protected override string ElementName
{
get
{
return base.ElementName;
}
}
public IDictionary<string, bool> Settings
{
get
{
if (settings == null)
{
settings = new Dictionary<string, bool>();
foreach (LoadSettingsElement e in this)
{
settings.Add(e.Key, e.Value);
}
}
return settings;
}
}
public bool this[string key]
{
get
{
bool isLoad = true;
if (settings.TryGetValue(key, out isLoad))
{
return isLoad;
}
else
{
throw new ArgumentException("没有对'" + key + "'节点进行配置。");
}
}
}
}
public class LoadSettingsElement : ConfigurationElement
{
[ConfigurationProperty("key", IsRequired = true)]
public string Key
{
get { return (string)base["key"]; }
set { base["key"] = value; }
}
[ConfigurationProperty("value", IsRequired = true)]
public bool Value
{
get { return (bool)base["value"]; }
set { base["value"] = value; }
}
}
public class PathSettingElement : ConfigurationElement
{
/// <summary>
///
/// </summary>
[ConfigurationProperty("SavePath", IsRequired = true)]
public string SavePath
{
get { return (string)base["SavePath"]; }
set { base["SavePath"] = value; }
}
/// <summary>
///
/// </summary>
[ConfigurationProperty("SearchSubPath", IsRequired = false, DefaultValue = true)]
public bool SearchSubPath
{
get { return (bool)base["SearchSubPath"]; }
set { base["SearchSubPath"] = value; }
}
}
/// <summary>
/// 对应config文件中的
/// </summary>
public sealed class SoftwareSettings : ConfigurationSection
{
/// <summary>
/// 对应SoftwareSettings节点下的LoadSettings子节点
/// </summary>
[ConfigurationProperty("LoadSettings", IsRequired = true)]
public LoadSettingsCollection LoadSettings
{
get { return (LoadSettingsCollection)base["LoadSettings"]; }
}
/// <summary>
/// 对应SoftwareSettings节点下的PathSettings子节点,非必须
/// </summary>
[ConfigurationProperty("PathSettings", IsRequired = false)]
public PathSettingElement PathSetting
{
get { return (PathSettingElement)base["PathSettings"]; }
set { base["PathSettings"] = value; }
}
}
}
在上面的代码中可以看到ConfigurationProperty这个属性,这是表示对应的属性在config文件中的属性名,IsRequired表示是否是必须的属性,还有DefaultValue表示属性的默认值。初次之外,我们还要注意以下关系:
SoftwareSettings:根节点,继承自ConfigurationSection。
LoadSettingsCollection:子节点集合,继承自ConfigurationElementCollection。
LoadSettingsElement:子节点,继承自ConfigurationElement。
PathSettingElement:子节点,继承自ConfigurationElement。
编写了如下代码之后,我们又该如何使用上面的类呢?其实很简单,如下:
class Program
{
static void Main(string[] args)
{
SoftwareSettings softSettings = ConfigurationManager.GetSection("SoftwareSettings") as SoftwareSettings;
foreach (string key in softSettings.LoadSettings.Settings.Keys)
{
Console.WriteLine("{0}={1}", key, softSettings.LoadSettings[key]);
}
Console.WriteLine("SavePath={0},SearchSubPath={1}", softSettings.PathSetting.SavePath, softSettings.PathSetting.SearchSubPath);
Console.ReadLine();
}
}
class Program
{
static void Main(string[] args)
{
SoftwareSettings softSettings = ConfigurationManager.GetSection("SoftwareSettings") as SoftwareSettings;
foreach (string key in softSettings.LoadSettings.Settings.Keys)
{
Console.WriteLine("{0}={1}", key, softSettings.LoadSettings[key]);
}
Console.WriteLine("SavePath={0},SearchSubPath={1}", softSettings.PathSetting.SavePath, softSettings.PathSetting.SearchSubPath);
Console.ReadLine();
}
}
这个程序的运行结果如下:
LoadBmp=True
LoadJpg=True
LoadGif=True
LoadPng=False
SavePath=C:\ResizeImages\,SearchSubPath=True