C#除了appSettings和connectionStrings默認配置外還允許用戶自定義使用配置。C# 提供3中簡單的自定義配置,配置文件如下
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="Config1" type="System.Configuration.SingleTagSectionHandler"/> <section name="Config2" type="System.Configuration.DictionarySectionHandler"/> <section name="Config3" type="System.Configuration.NameValueSectionHandler"/> </configSections> <Config1 a="1" b="2"/> <Config2> <add key="a" value="1"/> <add key="b" value="2"/> </Config2> <Config3> <add key="a" value="1"/> <add key="b" value="2"/> </Config3> </configuration>
使用這3種中配置要注意:
1. configSections節點必須要是配置的第一個節點。
2. 自定義配置要在configSections內部聲明。格式是<section name="配置名" type="類的全路徑,dll名"/> 系統的這3種配置dll省略。
3. 針對以上3種配置格式不能變,不能變,不能變,重要的事說3遍 。<Config1 a="1" b="2"></Config1 > 這種寫法 拋出異常。
這3中使用也比較簡單,用ConfigurationManager.GetSection(XXX)獲取節點數據。第一種和第二種都返回Hashtable類型(Hashtable實現IDictionary接口),第三種返回NameValueCollection 與appSettings返回類型相同。

1 public static void Main(string[] args) 2 { 3 // Hashtable 4 Hashtable config1 = (Hashtable)ConfigurationManager.GetSection("Config1"); 5 Dictionary<string, string> c = new Dictionary<string, string>(); 6 Console.WriteLine("****************配置1**********************"); 7 Console.WriteLine("遍歷"); 8 foreach (DictionaryEntry g in config1) 9 { 10 Console.WriteLine(g.Key + "=" + g.Value); 11 } 12 Console.WriteLine("使用:a=" + config1["a"]); 13 14 15 Hashtable config2 = (Hashtable)ConfigurationManager.GetSection("Config2"); 16 Console.WriteLine("****************配置2**********************"); 17 Console.WriteLine("遍歷"); 18 foreach (DictionaryEntry g in config1) 19 { 20 Console.WriteLine(g.Key + "=" + g.Value); 21 } 22 Console.WriteLine("使用:a=" + config1["a"]); 23 24 25 26 Console.WriteLine("****************配置3**********************"); 27 NameValueCollection config3 = (NameValueCollection)ConfigurationManager.GetSection("Config3"); 28 Console.WriteLine("遍歷"); 29 foreach (var item in config3.AllKeys) 30 { 31 Console.WriteLine(item + "=" + config3[item]); 32 } 33 Console.WriteLine("使用:a=" + config3["a"]); 34 35 Console.ReadLine(); 36 }
調試結果:
接下來我們來講講如何使用自己格式的配置方法,
一.建立一個配置文件 如下
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="MyConfig" type="CustomConfig.MyConfig.ConfigHandler,CustomConfig" /> 5 </configSections> 6 7 <MyConfig c="3"> 8 <a>1</a> 9 <b>2</b> 10 </MyConfig> 11 12 13 </configuration>
確定數據格式和解析類。
二.解析類
1 namespace CustomConfig.MyConfig 2 { 3 public class ConfigHandler : IConfigurationSectionHandler 4 { 5 public object Create(object parent, object configContext, XmlNode section) 6 { 7 ConfigModel model = new ConfigModel //根據需要的類型來返回 8 { 9 a = section.SelectSingleNode("/MyConfig/a").InnerText, 10 b = section.SelectSingleNode("/MyConfig/b").InnerText, 11 c = section.SelectSingleNode("/MyConfig").Attributes.GetNamedItem("c").Value 12 }; 13 return model; 14 } 15 } 16 17 public class ConfigModel 18 { 19 public string a { get; set; } 20 public string b { get; set; } 21 public string c { get; set; } 22 } 23 }
1.配置解析類要實現 IConfigurationSectionHandler j接口 Create函數為具體解析函數,XmlNode section 包含節點全部數據
2.確定數據的返回格式如 ConfigModel,可根據需要編寫。
3.解析方法和解析Xml相同。
三. 取配置數據
方法與之前相同一樣用ConfigurationManager.GetSection(XXX)函數 ,執行時會自動調用解析類。
public static void Main(string[] args) { ConfigModel config = (ConfigModel)ConfigurationManager.GetSection("MyConfig"); Console.WriteLine(config.a + "," + config.b + "," + config.c); }