.Net 設定檔-繼承ConfigurationSection實作自訂處理類別處理自訂設定節點
除了使用繼承IConfigurationSectionHandler的方法定義處理自訂節點的類,還可以透過繼承ConfigurationSection類別來實現同樣效果。
首先說下.Net設定檔中一個潛規則
#在設定節點時,對於想要進行儲存的參數數據,可以採用兩種方式:一種是儲存到節點的屬性中,另一種是儲存在節點的文字中。
因為一個節點可以有很多屬性,但是只要一個innertext,而要在程式中將這兩種形式區分開會帶來複雜性。 為了避免這個問題,.net的設定檔只是用屬性儲存而不使用innertext.
接著,我們來寫一個符合這個潛規則的自訂設定文件,方便測試:
<mailServerGroup provider="www.baidu.com"> <mailServers> <mailServer client="http://blog.csdn.net/lhc1105" address="13232@qq.com" userName="lhc" password="2343254"/> <mailServer client="http://blog345.csdn.net/lhc1105" address="132wdfgdsggtaewg32@qq.com" userName="dfshs水田如雅" password="2334t243的萨芬234254"/> <mailServer client="http://blog436.csdn.net/lhc1105" address="132wdgadsfgdtaewg32@qq.com" userName="sdfhdfs水田如雅" password="23ewrty2343的萨芬234254"/> <mailServer client="http://blo345734g.csdn.net/lhc1105" address="132wdgdfagdstaewg32@qq.com" userName="sdfher水田如雅" password="23erwt43的萨芬234254"/> </mailServers> </mailServerGroup>
#接著,我們來寫對應的處理類,這裡我們由內向外來寫:
#首先是最內層的mailServer:
/// <summary> /// Class MailServerElement:用于映射mailServer节点,这里是实际存储数据的地方; /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:51:57</remarks> public sealed class MailServerElement : ConfigurationElement //配置文件中的配置元素 { /// <summary> /// Gets or sets the client. /// </summary> /// <value>The client.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:40</remarks> [ConfigurationProperty("client", IsKey = true, IsRequired = true)] //client是必须的key属性,有点儿主键的意思,例如,如果定义多个client相同的节点,循环读取的话就只读取到最后一个值 public string Client { get { return this["client"] as string; } set { this["client"] = value; } } /// <summary> /// Gets or sets the address. /// </summary> /// <value>The address.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:38</remarks> [ConfigurationProperty("address")] public string Address { get { return this["address"] as string; } set { this["address"] = value; } } /// <summary> /// Gets or sets the name of the user. /// </summary> /// <value>The name of the user.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:35</remarks> [ConfigurationProperty("userName")] public string UserName { get { return this["userName"] as string; } set { this["userName"] = value; } } /// <summary> /// Gets or sets the password. /// </summary> /// <value>The password.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:33</remarks> [ConfigurationProperty("password")] public string Password { get { return this["password"] as string; } set { this["password"] = value; } } }
接著是mailServers,它是一個mailServer的集合:
/// <summary> /// Class MailServerCollection:映射mailServers节点,为一个集合类,另外还包含了很多对节点的操作方法,大部分继承自ConfigurationElementCollection /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:52:00</remarks> public sealed class MailServerCollection : ConfigurationElementCollection { /// <summary> /// 获取 <see cref="T:System.Configuration.ConfigurationElementCollection" /> 的类型。 /// </summary> /// <value>The type of the collection.</value> /// <returns>此集合的 <see cref="T:System.Configuration.ConfigurationElementCollectionType" />。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:08</remarks> public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } /// <summary> /// 当在派生的类中重写时,创建一个新的 <see cref="T:System.Configuration.ConfigurationElement" />。 /// </summary> /// <returns>新的 <see cref="T:System.Configuration.ConfigurationElement" />。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:03</remarks> protected override ConfigurationElement CreateNewElement() { return new MailServerElement(); } /// <summary> /// 在派生类中重写时获取指定配置元素的元素键。 /// </summary> /// <param name="element">要为其返回键的 <see cref="T:System.Configuration.ConfigurationElement" />。</param> /// <returns>一个 <see cref="T:System.Object" />,用作指定 <see cref="T:System.Configuration.ConfigurationElement" /> 的键。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:04:51</remarks> protected override object GetElementKey(ConfigurationElement element) { return (element as MailServerElement).Client; } /// <summary> /// 获取在派生的类中重写时用于标识配置文件中此元素集合的名称。 /// </summary> /// <value>The name of the element.</value> /// <returns>集合的名称;否则为空字符串。默认值为空字符串。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:41:40</remarks> protected override string ElementName { get { return "mailServer"; } } /// <summary> /// 获取集合中的元素数。 /// </summary> /// <value>The count.</value> /// <returns>集合中的元素数。</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:08:24</remarks> public new int Count { get { return base.Count; } } /// <summary> /// 获取或设置此配置元素的属性、特性或子元素。 /// </summary> /// <param name="index">The index.</param> /// <returns>MailServerElement.</returns> /// <remarks>Editor:v-liuhch</remarks> public MailServerElement this[int index] { get { return BaseGet(index) as MailServerElement; } set { if (BaseGet(index) != null) { BaseRemoveAt(index); } BaseAdd(index, value); } } /// <summary> /// 获取或设置此配置元素的属性、特性或子元素。 /// </summary> /// <param name="Name">The name.</param> /// <returns>MailServerElement.</returns> /// <remarks>Editor:v-liuhch</remarks> new public MailServerElement this[string Name] { get { return BaseGet(Name) as MailServerElement; } } /// <summary> /// Indexes the of. /// </summary> /// <param name="element">The element.</param> /// <returns>System.Int32.</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:24:16</remarks> public int IndexOf(MailServerElement element) { return BaseIndexOf(element); } /// <summary> /// Adds the specified element. /// </summary> /// <param name="element">The element.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:26:06</remarks> public void Add(MailServerElement element) { BaseAdd(element); } /// <summary> /// Removes the specified element. /// </summary> /// <param name="element">The element.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:27:01</remarks> public void Remove(MailServerElement element) { if (BaseIndexOf(element) > 0) { BaseRemove(element.Client); } } /// <summary> /// Removes at. /// </summary> /// <param name="index">The index.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:33:29</remarks> public void RemoveAt(int index) { BaseRemoveAt(index); } /// <summary> /// Removes the specified client. /// </summary> /// <param name="client">The client.</param> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:04</remarks> public void Remove(string client) { BaseRemove(client); } /// <summary> /// Clears this instance. /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:34:29</remarks> public void Clear() { BaseClear(); } }
最後是最外層的group:
/// <summary> /// Class MailServerSection 为入口: /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 21:41:02</remarks> public class MailServerSection : ConfigurationSection //继承配置文件中节 { /// <summary> /// Gets the provider.:映射mailServerGroup节点的provider /// </summary> /// <value>The provider.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:59</remarks> [ConfigurationProperty("provider", IsKey = true)] public string provider { get { return this["provider"] as string; } } /// <summary> /// Gets or sets the mail servers.:映射新添加的节点mailServers节点;这个节点下还包含了若干个mailServer节点,因此它是一个集合类 /// </summary> /// <value>The mail servers.</value> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 22:05:56</remarks> [ConfigurationProperty("mailServers", IsDefaultCollection = false)] public MailServerCollection MailServers { get { return this["mailServers"] as MailServerCollection; } set { this["mailServers"] = value; } } }
同樣,關聯處理類別和節點:
<section name="mailServerGroup" type="继承ConfigurationSection基类.MailServerSection,继承ConfigurationSection基类"/> </configSections>
之後再做個測試:
class Program { static void Main(string[] args) { Test(); } /// <summary> /// Tests this instance.:读取节点值示例 /// </summary> /// <remarks>Editor:v-liuhch CreateTime:2015/6/27 23:04:53</remarks> private static void Test() { MailServerSection mailSection = (MailServerSection)ConfigurationManager.GetSection("mailServerGroup"); Console.WriteLine("MailServerSection 的provider属性值:"+mailSection.provider); foreach (MailServerElement config in mailSection.MailServers) { Console.WriteLine("----------------------------------"); Console.WriteLine("client值为:"+config.Client); Console.WriteLine("address值为:"+config.Address); Console.WriteLine("username值为:"+config.UserName); Console.WriteLine("password值为:"+config.Password); Console.WriteLine("----------------------------------"); } Console.ReadKey(); } }
本來還想傳張結果圖,但網速慢,算啦,喜歡玩兒的童鞋自己run下結果。 。 。 。 。
以上就是.Net 設定檔-繼承ConfigurationSection實作自訂處理類別處理自訂設定節點 的內容,更多相關內容請關注PHP中文網(www.php.cn )!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如果你從行動電信商購買了筆記型電腦,則很可能可以選擇啟動eSIM並使用手機網路將電腦連接到網路。有了eSIM,您無需將另一張實體SIM卡插入筆記型電腦,因為它已經內建。當您的裝置無法連接到網路時,它非常有用。如何檢查我的Windows11裝置是否相容於eSIM卡?點擊“開始”按鈕,然後轉到“網路和互聯網”>“蜂窩>設定”。如果您沒有看到「蜂窩行動網路」選項,則您的裝置沒有eSIM功能,您應該選取其他選項,例如使用行動裝置將筆記型電腦連接到熱點。為了激活和

為什麼要寫設定檔這個固定檔我們可以直接寫成一個.py 文件,例如settings.py 或config.py,這樣的好處就是能夠在同一工程下直接透過import 來導入當中的部分;但如果我們需要在其他非Python 的平台進行設定檔共用時,寫成單一.py 就不是一個很好的選擇。這時我們就應該選擇通用的設定檔類型來作為儲存這些固定的部分。目前常用且流行的設定檔格式類型主要有 ini、json、toml、yaml、xml 等,這些類型的設定檔我們都可以透過標準函式庫或第三方函式庫來進

設定無線網路很常見,但選擇或變更網路類型可能會令人困惑,尤其是在您不知道後果的情況下。如果您正在尋找有關如何在Windows11中將網路類型從公用變更為私有或反之亦然的建議,請繼續閱讀以取得一些有用的資訊。 Windows11中有哪些不同的網路設定檔? Windows11附帶了許多網路設定文件,這些設定檔本質上是可用於配置各種網路連線的設定集。如果您在家中或辦公室有多個連接,這將非常有用,因此您不必每次連接到新網路時都進行所有設定。專用和公用網路設定檔是Windows11中的兩種常見類型,但通

最近有不少Win10系統的使用者想要更改使用者設定文件,但不清楚具體如何操作,本文將為大家帶來Win10系統設定使用者設定檔的操作方法吧! Win10如何設定使用者設定檔1、首先,按下「Win+I」鍵開啟設定介面,並點選進入「系統」設定。 2、接著,在打開的介面中,點擊左側的“關於”,再找到並點擊其中的“高級系統設定”。 3、然後,在彈出的視窗中,切換到「」選項欄,並點擊下方「用戶配

當今人工智慧(AI)技術的發展如火如荼,它們在各個領域都展現了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI模型LLM相關的專案框架,希望能為大家提供一些參考。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一種開源的軟體開發工具包(SDK),旨在將大型語言模型(LLM)如OpenAI、Azure

為什麼要寫設定檔在開發過程中,我們常常會用到一些固定參數或是常數。對於這些較為固定且常用到的部分,往往會將其寫到一個固定檔案中,避免在不同的模組程式碼中重複出現從而保持核心程式碼整潔。這個固定文件我們可以直接寫成一個.py 文件,例如settings.py 或config.py,這樣的好處就是能夠在同一工程下直接透過import 來導入當中的部分;但如果我們需要在其他非Python 的平台進行設定檔共享時,寫成單一.py 就不是一個很好的選擇。這時我們就應該選擇通用的設定檔類型來

解決eclipse亂碼問題的有效方法,需要具體程式碼範例近年來,隨著軟體開發的飛速發展,eclipse作為最受歡迎的整合開發環境之一,為眾多開發者提供了便利和高效。然而,使用eclipse時可能會遇到亂碼問題,這對於專案開發和程式碼閱讀帶來了困擾。本文將介紹一些解決eclipse亂碼問題的有效方法,並提供具體程式碼範例。修改eclipse檔案編碼設定:在eclip
