http://blog.csdn.net/ligenyingsr/article/details/54095986

System.ConfigurationManager类用于对配置文件的读取。其具有的成员如下:

一、AppSettings

  AppSetting是最简单的配置节,读写非常简单。

名称 说明
AppSettings 获取当前应用程序默认配置的 AppSettingsSection 数据
ConnectionStrings 获取当前应用程序默认配置的 ConnectionStringsSection 数据
<?xml version="1.0" encoding="utf-8" ?>
<configuration> <appSettings> <add key="DB" value="Access" /> </appSettings> <connectionStrings> <add name="connstr" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\C#Code\DBOperation\ykjj.mdb"/> </connectionStrings> </configuration>

  示例:

    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

  配置文件代码示例:

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections> <section name="Person" type="System.Configuration.NameValueSectionHandler"/> <!--以NameValue键值/对的形式返回配置节中的信息--> <section name="Man" type="System.Configuration.DictionarySectionHandler"/> <!--以Dictionary字典键值对的形式返回配置节中的信息--> <section name="Name" type="System.Configuration.SingleTagSectionHandler" /> <!--基础结构。处理 .config 文件中由单个 XML 标记所表示的各配置节。--> </configSections> <Person> <add key="老大" value="刘备" /> <add key="老二" value="关羽" /> <add key="老三" value="张飞" /> </Person> <Man> <add key="老大" value="曹操" /> <add key="老二" value="典韦" /> <add key="老三" value="郭嘉" /> </Man> <Name one="1" two="2" three="3" four="4" five="5" /> <!--注意是要单个节SingleTagSectionHandler才能处理,但是无论你索性有多少个也能处理--> </configuration>

  读取代码示例:

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]); } IDictionary dict1 = (IDictionary)ConfigurationManager.GetSection("Name"); foreach (string key in dict1.Keys) { Console.WriteLine(key + ":" + dict1[key]); } Console.ReadKey(); }

  输出结果如下:

  

  2、自定义Handler

  自定义读取节点需要实现接口IConfigurationSectionHandler,并提供Create的具体实现。

  Appconfig代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections> <!--后面的type是处理处理节点PersonHandler所在的位置第二个参数是程序集,你可以不要Version开始之后的--> <section name="Person" type="ConsoleApplication1.PersonHandler,ConsoleApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /> </configSections> <Person age="23" name="刘备" /> </configuration>

  主程序代码:

  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属性的方式读取

  1. 使用这种方法,需要自定义一个类,并且要继承自ConfigurationSection基类。ConfigurationProperty的构造函数中传入的name字符串将会用于config文件中,表示各参数的属性名称。
  2. 属性的值的读写要调用this[]或base[],由基类去保存,请不要自行设计Field来保存。
  3. 为了能使用配置节点能被解析,需要在<configSections>中注册: <section name="Person" type="ConsoleApplication1.PersonSection,ConsoleApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /> ,且要注意name="Person"要与<Person ..... >是对应的。

  先来看看配置文件的写法:

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections> <!--后面的type是处理处理节点PersonSection所在的位置第二个参数是程序集,你可以不要Version开始之后的--> <section name="Person" type="ConsoleApplication1.PersonSection,ConsoleApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /> </configSections> <Person age="23" name="刘备" /> </configuration>

  然后程序代码:

    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文件代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections> <section name="complex" type="ConsoleApplication1.ComplexSection,ConsoleApplication1"/> </configSections> <complex height="182"> <child firstName="张" lastName="飞"/> </complex> </configuration>

  主程序代码:

  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了。

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections> <section name="MySection" type="ConsoleApplication1.MySection, ConsoleApplication1" /> </configSections> <MySection> <HTML> <![CDATA[ <div style="# font-size:24px">加粗显示</div> ]]> </HTML> <SQL> <![CDATA[ SELECT TOP 10 * FROM Person ]]> </SQL> </MySection> </configuration>

  主程序代码如下:

namespace ConsoleApplication1
{class Program{static void Main(string[] args) { MySection section = ConfigurationManager.GetSection("MySection") as MySection; Console.WriteLine("{0}{1}", section.HTML.CommandText, section.SQL.CommandText); Console.ReadKey(); } } //注意 这里是继承自System.Configuration.ConfigurationSection了 class MySection : System.Configuration.ConfigurationSection { [ConfigurationProperty("HTML", IsRequired = false)] public MyTextElement HTML { get { return (MyTextElement)base["HTML"]; } set { base["HTML"] = value; } } [ConfigurationProperty("SQL", IsRequired = false)] public MyTextElement SQL { get { return (MyTextElement)base["SQL"]; } set { base["SQL"] = value; } } } public class MyTextElement : ConfigurationElement { protected override void DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey) { CommandText = reader.ReadElementContentAs(typeof(string), null) as string; } protected override bool SerializeElement(System.Xml.XmlWriter writer, bool serializeCollectionKey) { if (writer != null) { writer.WriteCData(CommandText); } return true; } [ConfigurationProperty("data", IsRequired = false)] public string CommandText { get { return this["data"].ToString(); } set { this["data"] = value; } } } }

  输出如下:

  

  6、配置元素Collection

  类似下面的配置方式,在ASP.NET的HttpHandler, HttpModule中太常见了。

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections> <section name="MySection" type="ConsoleApplication1.MySection, ConsoleApplication1" /> </configSections> <MySection> <add key="a" value="刘备"></add> <add key="b" value="关羽"></add> <add key="c" value="张飞"></add> </MySection> </configuration>

  实现代码如下:

    class Program{static void Main(string[] args) { MySection section = ConfigurationManager.GetSection("MySection") as MySection; foreach (MyKeyValueSetting add in section.KeyValues) { Console.WriteLine(add.Key + ":" + add.Value); } Console.ReadKey(); } } public class MySection : ConfigurationSection // 所有配置节点都要选择这个基类  { private static readonly ConfigurationProperty s_property = new ConfigurationProperty(string.Empty, typeof(MyKeyValueCollection), null, ConfigurationPropertyOptions.IsDefaultCollection); [ConfigurationProperty("", Options = ConfigurationPropertyOptions.IsDefaultCollection)] public MyKeyValueCollection KeyValues { get { return (MyKeyValueCollection)base[s_property]; } } } [ConfigurationCollection(typeof(MyKeyValueSetting))] public class MyKeyValueCollection : ConfigurationElementCollection // 自定义一个集合  { // 基本上,所有的方法都只要简单地调用基类的实现就可以了。 public MyKeyValueCollection() : base(StringComparer.OrdinalIgnoreCase) // 忽略大小写  { } // 其实关键就是这个索引器。但它也是调用基类的实现,只是做下类型转就行了。 new public MyKeyValueSetting this[string name] { get { return (MyKeyValueSetting)base.BaseGet(name); } } // 下面二个方法中抽象类中必须要实现的。 protected override ConfigurationElement CreateNewElement() { return new MyKeyValueSetting(); } protected override object GetElementKey(ConfigurationElement element) { return ((MyKeyValueSetting)element).Key; } // 说明:如果不需要在代码中修改集合,可以不实现Add, Clear, Remove public void Add(MyKeyValueSetting setting) { this.BaseAdd(setting); } public void Clear() { base.BaseClear(); } public void Remove(string name) { base.BaseRemove(name); } } public class MyKeyValueSetting : ConfigurationElement // 集合中的每个元素  { [ConfigurationProperty("key", IsRequired = true)] public string Key { get { return this["key"].ToString(); } set { this["key"] = value; } } [ConfigurationProperty("value", IsRequired = true)] public string Value { get { return this["value"].ToString(); } set { this["value"] = value; } } }

  输出如下:

  

  小结:

  1. 为每个集合中的参数项创建一个从ConfigurationElement继承的派生类。
  2. 为集合创建一个从ConfigurationElementCollection继承的集合类,具体在实现时主要就是调用基类的方法。
  3. 在创建ConfigurationSection的继承类时,创建一个表示集合的属性就可以了,注意[ConfigurationProperty]的各参数。

  7、配置节点的写入

  写入配置节点的示例如下:

    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);PersonSection Section = config.GetSection("Person") as PersonSection; Section.Name = "撼地神牛"; Section.Age = 10000; config.Save(); ConfigurationManager.RefreshSection("Person"); //让修改之后的结果生效

  在修改配置节点前,我们需要调用ConfigurationManager.OpenExeConfiguration(),然后调用config.GetSection()在得到节点后,转成我们定义的节点类型, 然后就可以按照强类型的方式来修改我们定义的各参数项,最后调用config.Save();即可。

  注意:

  1. .net为了优化配置节点的读取操作,会将数据缓存起来,如果希望使用修改后的结果生效,您还需要调用ConfigurationManager.RefreshSection(".....")。
  2. 如果是修改web.config,则需要使用 WebConfigurationManager。

  8、读取.Net Framework中已经定义的节点

  .Net Framework已定义节点的读取很简单:

  <system.web><httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpModules> </system.web>

  主程序如下:

public ActionResult Index(){HttpModulesSection section = ConfigurationManager.GetSection("system.web/httpModules") as HttpModulesSection; foreach (HttpModuleAction action in section.Modules) { Response.Write(action.Name + "<br/>"); } return Content(""); } 

  输出如下:

  

  注意,连服务器上mechine里面的配置都会一起读出来。

  在Web.config里是只读的,写不了,而非Web程序的写与上面的例子一样,此处不再复述。

转载:http://www.cnblogs.com/kissdodog/archive/2013/04/11/3014227.html

转载于:https://www.cnblogs.com/LuoEast/p/8570525.html

System.ConfigurationManager类用于对配置文件的读取相关推荐

  1. c# uri 取文件名_C# System.Uri类_获取Url的各种属性_文件名_参数_域名_端口等等

    System.Uri类用于处理Uri地址信息,常用到它的地方有,相对Uri地址转绝对Uri地址,获取Uri的某部分信息等等,可以说是一个非常有用的类. 一.属性 AbsolutePath 获取 URI ...

  2. 一个用于读写配置文件的类

    一个用于读写配置文件的类 该类适应读写如下格式的.xml,.config文档 <?xml version="1.0" encoding="utf-8" s ...

  3. 古怪的ConfigurationManager类

    开始使用VS 2005,习惯性的使用ConfigurationSettings类来读取应用程序配置文件的信息时,却被编译器提示说:警告  1 "System.Configuration.Co ...

  4. spring boot 之配置文件yarm读取04

    1.springboot 读取配置文件yarn 1.1 准备配置文件yaml 在main目录下新建resources目录,并设置为Root Resources,新建文件application.yaml ...

  5. java读取mysql数据库配置文件_java读取properties文件的方法

    Java 读写Properties配置文件 Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实 ...

  6. 【应用】Properties类与Properties配置文件的读写

    1.Properties类与Properties配置文件 什么是Properties类 Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程 ...

  7. worldwind java加载3ds_WorldWind Java 版学习:3、配置文件的读取

    1.在 WorldWindow 启动过程中,直接读取的配置文件有三个: 一个是在程序启动前,使用静态模块配置程序的配置文件 System.setProperty("gov.nasa.worl ...

  8. C++实现通讯录管理系统(OOP类,链表,文件读取等操作实现通讯录的基本功能)

    这里写自定义目录标题 分析 1.需求分析 2.设计 3.抽象类型定义 通讯录管理系统功能介绍 1.添加联系人 2.查询联系人 3.修改联系人 4.删除联系人 5.显示所有联系人 6.保存到文件 0.退 ...

  9. java下mysql连接配置文件_Java读取.properties配置文件并连接数据库

    1.读取配置文件 //Properties集合 流对象读取键值对 public static void getNum() throws Exception { Properties p=new Pro ...

  10. Java黑皮书课后题第10章:*10.10(Queue类)10.6节给出一个Stock类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素后进先出。队列中元素先进先出

    10.10(Queue类)10.6节给出一个Stock类,设计一个名为Queue的类用于存储整数 题目 程序 破题 代码 Test10.java Test10_Queue.java UML 题目 程序 ...

最新文章

  1. 沉痛哀悼!现代无线网络之父 Norman Abramson 辞世,享年 88 岁
  2. 写给对 ”游戏开发” 感兴趣的朋友们
  3. 《02》let 和 const 命令
  4. 全球六大国际域名解析量统计报告(6月25日)
  5. Android UDP
  6. 为什么录像总是很暗_深度:为什么看马拉多纳的踢球视频,并不觉得他很厉害?...
  7. Java 基础(十九)代理
  8. PHP毕业设计 学生PHP网站模板 PHP校园二手商品网站源码 PHP MYSQL大学生动态网站毕设作品 PHP毕设网页学生成品
  9. JS 在线预览Word
  10. Qt程序退出QThread: Destroyed while thread is still running问题
  11. task4b_Nature_Pan_Cancer_词云
  12. 分享你喜欢的杀毒软件
  13. python万年历节气_python3实现万年历(包括公历、农历、节气、节日)
  14. Apache虚拟主机配置
  15. 向量空间、内积空间、欧式空间以及希尔伯特空间的关系
  16. Bagging和Boosting的概念和区别
  17. 什么是操作系统?操作系统的功能有哪些??
  18. android img 文件解包
  19. AVS2解码图像管理
  20. 2021年度软件企业 100 强榜单(附全名单)有你么?

热门文章

  1. Cesium应用篇:3控件(1)Clock
  2. spoj 2798 Query on a tree again! 树链剖分
  3. BlogEngine学习二:基于ICallbackEventHandler的轻量级Ajax方式
  4. srs部署到ubuntu 18.04 server
  5. CS 231n 学习笔记 03——课程3.1 损失函数
  6. PCB名詞解釋:通孔、盲孔、埋孔(转载)
  7. mongodb 常用操作(转)
  8. 接口返回buffer的16进制数据如何转换
  9. 洛谷P3379 【模板】最近公共祖先(LCA)(树链剖分)
  10. tcp/ip网络协议学习