C# 快捷使用自定義配置節點


  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);
        }

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM