我们可以把webconfig里面每一个section映射成相关类,做法如下,我们看webconfig的配制
<configuration>
<configSections>
<sectionGroup name="WebApplication2">
<section name="aaa" type="WebApplication2.Class1, WebApplication2" />
</sectionGroup>
</configSections>
<WebApplication2>
<aaa>
<add key="A" value="aaa" />
<add key="B" value="bbb" />
</aaa>
</WebApplication2>
</configuration>
我们利用
ConfigurationSettings.GetConfig("WebApplication2/aaa");访问
报
类型“WebApplication2.Class1”不从“System.Configuration.IConfigurationSectionHandler”继承。
新建一个类WebApplication2.Class1类继承System.Configuration.IConfigurationSectionHandler
只需要实现一个方法
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
return new DataColumn();//随便反回一个什么东西
}
这时ConfigurationSettings.GetConfig("WebApplication2/aaa");就返回了个DataColumn
在实验过程中发现,程序第一次运行的时候可以调试到Create这个方法,第二次运行的时候就调试不到了
(也许存在某个地方了)
这还不是我们想要的
我们看一下第一次访问时调试到的Create方法中,运行时传进来的几个参数
parent=null
configContext=WebApplication2
section=<add key="A" value="aaa" /><add key="B" value="bbb" />
目前发现,只要webconfig改了,也可以调试到Create,看来运行时每次都会判断webconfig改了没有
有了configContext和section我们一定是可以知道key和value的,怎么做呢
利用System.Collections.Specialized.NameValueCollection,NameValueSectionHandler这两个类
NameValueSectionHandler 这个类也继承IConfigurationSectionHandler
反编译可以看出NameValueSectionHandler 的creater方法把参数section的结果转化成了一个集合
就是NameValueCollection
所以我们可以写下面的代码
NameValueCollection tem;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
tem=(NameValueCollection)baseHandler.Create(parent,configContext,section);
然后
属性a=tem["A"];
属性b=tem["B"];
属性的赋值就不用多写了
例子如下
using System;
using System.Configuration;
using System.Data;
using System.Collections.Specialized;
namespace WebApplication2
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class Class1:IConfigurationSectionHandler
{
static string a;
static string b;
public Class1()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IConfigurationSectionHandler 成员
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
NameValueCollection tem;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
tem=(NameValueCollection)baseHandler.Create(parent,configContext,section);
a=tem["A"];
b=tem["B"];
return null;
}
#endregion
public static string A
{
get
{
return a;
}
set
{
a=value;
}
}
public static string B
{
get
{
return b;
}
set
{
b=value;
}
}
}
}
然后我们在Global.asax里面执行一下
ConfigurationSettings.GetConfig("WebApplication2/aaa");
目的是让他执行一下create,赋一下属性值
我们就可以用class1.A来访问节点了.
就可以返回一个和节点相对应的类了
其实我觉得很怪的是,如果不反编译我怎么知道(NameValueCollection)baseHandler.Create
(parent,configContext,section);这么写