转自:http://www.cnblogs.com/kissdodog/archive/2013/04/16/3025315.html,这是一个专题,感觉比较好,有空可以看与一下
System.ConfigurationManager类用于对配置文件的读取。其具有的成员如下:
一、AppSettings
AppSetting是最简单的配置节,读写非常简单。
名称 | 说明 |
AppSettings | 获取当前应用程序默认配置的 AppSettingsSection 数据 |
ConnectionStrings | 获取当前应用程序默认配置的 ConnectionStringsSection 数据 |
示例:
class Program { static void Main(string[] args) { string strAppSettings = System.Configuration.ConfigurationManager.AppSettings["DB"]; //通过属性索引获取值 Console.WriteLine(strAppSettings); string strConnection = System.Configuration.ConfigurationManager.ConnectionStrings["connstr"].ToString(); Console.WriteLine(strConnection); Console.ReadKey(); } }
对于以上这一个appSettings与connectionStrings都是由ConfigurationManager提供的两个属性来读取的。通常大多数的配置信息都可以放在appSettings里。但是如果你觉得不够用了,你还可以使用自定义配置信息。
二、自定义配置节
1、自带Handler
关于自定义配置节,Configuration提供了很多Handler类来供你选择使用。甚至如果你觉得不够,还可以自定义处理Handler。
先来学下使用怎么使用三个简单的Handler:- System.Configuration.NameValueSectionHandler
- System.Configuration.DictionarySectionHandler
- System.Configuration.SingleTagSectionHandler
配置文件代码示例:
读取代码示例:
static void Main(string[] args){ //读取人名 NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("Person"); foreach (string key in nvc.AllKeys) { Console.WriteLine(key + ":" + nvc[key]); } //读取男人 IDictionary dict = (IDictionary)ConfigurationManager.GetSection("Man"); foreach (string key in dict.Keys) { Console.WriteLine(key + ":" + dict[key]); } Hashtable dic1 =(Hashtable)ConfigurationManager.GetSection("Name"); foreach (string key in dict1.Keys) { Console.WriteLine(key + ":" + dict1[key]); } Console.ReadKey();}
输出结果如下:
2、自定义Handler
自定义读取节点需要实现接口IConfigurationSectionHandler,并提供Create的具体实现。
Appconfig代码:
主程序代码:
class Program { static void Main(string[] args) { Hashtable config = ConfigurationManager.GetSection("Person") as Hashtable; Console.WriteLine("节点数量是:" + config.Count); //2重键值对的方式,其中deKey又可以再次转化为一个Hashtable foreach (DictionaryEntry deKey in config) { Console.WriteLine("属性元素: " + deKey.Key.ToString()); Hashtable attribs = (Hashtable)deKey.Value; foreach (DictionaryEntry deAttrib in attribs) { Console.WriteLine(deAttrib.Key.ToString() + "=" + deAttrib.Value.ToString()); } } Console.ReadKey(); } } //注意必须要实现IConfigurationSectionHandler接口 class PersonHandler : IConfigurationSectionHandler { public object Create(object parent, object configContext, System.Xml.XmlNode section) { Hashtable myConfig = new Hashtable(); // 本节元素,获取的任何属性。 Hashtable myAttribs = new Hashtable(); //遍历当前节点的属性 foreach (XmlAttribute attrib in section.Attributes) { //如果当前节点是属性节点,则添加进入myAttribs if (XmlNodeType.Attribute == attrib.NodeType) { myAttribs.Add(attrib.Name, attrib.Value); } } //把当前属性节点集合添加进myConfig myConfig.Add(section.Name, myAttribs); return myConfig; } }
输出结果如下:
这样的配置代码看起来还是有点吃力,毕竟Hashtable的层次有两层。
3、property属性的方式读取
- 使用这种方法,需要自定义一个类,并且要继承自ConfigurationSection基类。ConfigurationProperty的构造函数中传入的name字符串将会用于config文件中,表示各参数的属性名称。
- 属性的值的读写要调用this[]或base[],由基类去保存,请不要自行设计Field来保存。
- 为了能使用配置节点能被解析,需要在<configSections>中注册: <section name="Person" type="ConsoleApplication1.PersonSection,ConsoleApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /> ,且要注意name="Person"要与<Person ..... >是对应的。
先来看看配置文件的写法:
然后程序代码:
class Program { static void Main(string[] args) { PersonSection person = ConfigurationManager.GetSection("Person") as PersonSection; Console.WriteLine("name={0},age={1}", person.Age, person.Name); Console.ReadKey(); } } //注意 这里是继承自System.Configuration.ConfigurationSection了 class PersonSection : System.Configuration.ConfigurationSection { [ConfigurationProperty("age", IsRequired = false, DefaultValue = 0)] public int Age { get { return (int)base["age"]; } set { base["age"] = value; } } [ConfigurationProperty("name", IsRequired = false, DefaultValue = "")] public string Name { get { return (string)base["name"]; } set { base["name"] = value; } } }
输出结果如下:
4、配置子元素
对于稍微在复杂一点的结构,子元素的Model类要继承自ConfigurationElement。
config文件代码:
主程序代码:
class Program { static void Main(string[] args) { ComplexSection sec = ConfigurationManager.GetSection("complex") as ComplexSection; Console.WriteLine(sec.Height); //访问属性 Console.WriteLine(sec.Child.FirstName); //访问子节点属性 Console.WriteLine(sec.Child.LastName); //访问子节点属性 Console.ReadKey(); } } public class ComplexSection : ConfigurationSection { [ConfigurationProperty("height", IsRequired = true)] public int Height { get { return (int)base["height"]; } set { base["height"] = value; } } [ConfigurationProperty("child", IsDefaultCollection = false)] public ChildSection Child { get { return (ChildSection)base["child"]; } set { base["child"] = value; } } } public class ChildSection : ConfigurationElement { [ConfigurationProperty("firstName", IsRequired = true, IsKey = true)] public string FirstName { get { return (string)base["firstName"]; } set { base["firstName"] = value; } } [ConfigurationProperty("lastName", IsRequired = true)] public string LastName { get { return (string)base["lastName"]; } set { base["lastName"] = value; } } }
输出结果如图所示:
5、配置文件中的CDATA
有时候,在配置文件里可能会包含一些比较复杂的代码段,这时候就要用到XML的CDATA了。
加粗显示