詳解C#讀取Appconfig中自定義的節(jié)點(diǎn)
今天在使用Nlog的時(shí)候,發(fā)現(xiàn)了一個(gè)之前沒(méi)注意的問(wèn)題。

以前,我的app配置文件都是這么寫(xiě)的,當(dāng)然配置比較多的時(shí)候會(huì)改用xml。

如果<appSettings>節(jié)點(diǎn)中的內(nèi)容很多的話,我自己有時(shí)候都分不清哪個(gè)是做什么的,可能朋友們會(huì)說(shuō),你加個(gè)注釋不就行了。但是可不可以把一些相同的配置放在一起呢,就像上面的nlog一樣。先試著改造下配置文件
<configSections>
<section name="mySection" type="ConfigSolution.ConfigSectionHandler,ConfigSolution"></section>
</configSections>
<mySection>
<port CPort="40001" WPort="40002" SPort="50000"></port>
<coustomAssembly CommandsAssembly="HX.Components.Command.Collection" CommandMessagesAssembly="HX.Components.CommandMessage.Collection"></coustomAssembly>
</mySection>
那么,怎么獲取section里的值呢?從configSections 元素開(kāi)始到網(wǎng)上風(fēng)暴了一番。ConfigurationSection 類(lèi)
然后知道可以通過(guò)ConfigurationManager類(lèi)的GetSection方法獲取到配置文件的信息。(如果應(yīng)用程序需要以只讀方式訪問(wèn)其自身配置,則對(duì)于 Web 應(yīng)用程序,建議使用 GetSection() 重載方法;對(duì)于客戶端應(yīng)用程序,建議使用 ConfigurationManager.GetSection 方法。----MSDN)
var mySection = ConfigurationManager.GetSection("mySection");
運(yùn)行一下程序試試,迎來(lái)了第一個(gè)異常。System.Configuration.ConfigurationErrorsException: 創(chuàng)建 mySection 的配置節(jié)處理程序時(shí)出錯(cuò): 類(lèi)型“ConfigSolution.ConfigSectionHandler”不從“System.Configuration.IConfigurationSectionHandler”繼承。 ---> System.TypeLoadException: 類(lèi)型“ConfigSolution.ConfigSectionHandler”不從“System.Configuration.IConfigurationSectionHandler”繼承。
既然說(shuō)我的ConfigSolution.ConfigSectionHandler不從System.Configuration.IConfigurationSectionHandler繼承,那好,我就繼承它,然后看看這個(gè)接口都有些什么東西,Ctrl+T一下(SharpDevelop的快捷鍵),這接口就一個(gè)方法
直接MSDN一下,IConfigurationSectionHandler.Create 信息量不是很大,就一句話:IConfigurationSectionHandler.Create 方法,創(chuàng)建配置節(jié)處理程序。算了,直接斷點(diǎn)跟蹤一下,果然有東西

好了,剩下的就是對(duì)xml的讀取了。直接把section return看看,

這回程序正常運(yùn)行了,且mySection 也拿到了配置文件

但是在程序中我們?cè)趺传@取這些配置數(shù)據(jù)呢?我創(chuàng)建了一個(gè)處理配置文件的MySectionHelper類(lèi),大體如下
public class MySectionHelper
{
readonly XmlNode _section;
readonly XmlNode _coustomAssembly;
public MySectionHelper(XmlNode section)
{
_section=section;
_coustomAssembly= _section.SelectSingleNode("coustomAssembly");
}
public string CommandsAssembly{get{return _coustomAssembly.Attributes["CommandsAssembly"].Value;}}
}
試試行不行,我的配置文件
<configSections>
<section name="mySection" type="ConfigSolution.ConfigSectionHandler,ConfigSolution"></section>
</configSections>
<mySection>
<port CPort="40001" WPort="40002" SPort="50000"></port>
<coustomAssembly CommandsAssembly="HX.Components.Command.Collection" CommandMessagesAssembly="HX.Components.CommandMessage.Collection"></coustomAssembly>
</mySection>
運(yùn)行結(jié)果:

好了,一切完成。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
使用TypeScript開(kāi)發(fā)微信小程序的方法
TypeScript是C#之父Anders Hejlsberg的又一力作,很多喜歡c#語(yǔ)法的朋友對(duì)typescript都愛(ài)不釋手,今天小編給大家介紹下TypeScript開(kāi)發(fā)微信小程序的方法,感興趣的朋友一起看看吧2016-11-11
c#linq里的Skip和Take實(shí)現(xiàn)分頁(yè)或遍歷
LINQ的優(yōu)勢(shì)在于它提供了一種直觀、類(lèi)型安全的方式來(lái)操作各種類(lèi)型的數(shù)據(jù),查詢常需要獲取一部分?jǐn)?shù)據(jù),為了實(shí)現(xiàn)這一功能,LINQ提供了Take?和Skip運(yùn)算符,Take運(yùn)算符用于從一個(gè)序列中返回指定個(gè)數(shù)的元素,Skip運(yùn)算符用于從一個(gè)序列中跳過(guò)指定個(gè)數(shù)的元素2024-01-01
C#實(shí)現(xiàn)根據(jù)銀行卡卡號(hào)判斷銀行名
這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)銀行卡卡號(hào)判斷銀行名,是從其他網(wǎng)友的java程序改編而來(lái),有需要的小伙伴可以參考下。2015-07-07
C#使用Data?Annotations進(jìn)行手動(dòng)數(shù)據(jù)驗(yàn)證
這篇文章介紹了C#使用Data?Annotations進(jìn)行手動(dòng)數(shù)據(jù)驗(yàn)證的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C#中IEnumerable接口介紹并實(shí)現(xiàn)自定義集合
這篇文章介紹了C#中IEnumerable接口并實(shí)現(xiàn)自定義集合,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
httpwebreqeust讀取httponly的cookie方法
下面小編就為大家?guī)?lái)一篇httpwebreqeust讀取httponly的cookie方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01

