2015-10-09 35 views
2

我有一個關於通過ConfigurationManagerApp.config中檢索值的問題。使用ConfigurationManager從App.config中讀取嵌套值

這是我的App.config。我計劃將這些值外包給printers.config,並通過printerOverrides configSource="printers.config" />提取值。

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <sectionGroup name="printerOverrides"> 
     <section name="host" type="System.Configuration.NameValueSectionHandler" /> 
     </sectionGroup> 
     <section name="test" type="System.Configuration.NameValueSectionHandler"/> 
    </configSections> 

    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <printerOverrides> 
    <host name="machine1"> 
     <add key="defaultPrinter" value="Overridden" /> 
    </host> 
    <host name="machine2"> 
     <add key="defaultPrinter" value="Overridden" /> 
     <add key="otherSetting" value="OtherSettingValue" /> 
    </host> 
    </printerOverrides> 
    <test> 
    <add key="key1" value="value1" /> 
    </test> 
</configuration> 

我能夠得到來自<test> -section的值,而在這個片段中的任何問題:

var test = ConfigurationManager.GetSection("test") as NameValueCollection; 
Debug.WriteLine(test["key1"]); 

但我不能從或者通過在SectionGroup內容的章節檢索數據

var test = ConfigurationManager.GetSection("machine1") as NameValueCollection; 
Debug.WriteLine(test["defaultPrinter"]); 

var test = ConfigurationManager.GetSection("printerOverrides/machine1") as NameValueCollection; 
Debug.WriteLine(test["defaultprinter"]); 

我的XML無效嗎?或者我需要什麼來獲取SectionGroup中的嵌套部分的值

回答

3

儘管配置中的XML有效,但配置本身無效。

部分組配置不支持重複元素(每個元素必須是唯一的,並單獨指定)。 host元素也不能有任何屬性。

可以(種)達到你想要的東西通過這樣的配置:

<configSections> 
    <sectionGroup name="printerOverrides"> 
    <section name="host1" type="System.Configuration.NameValueSectionHandler" /> 
    <section name="host2" type="System.Configuration.NameValueSectionHandler" /> 
    </sectionGroup> 
</configSections> 

<printerOverrides> 
    <host1> 
    <add key="defaultPrinter" value="Overridden" /> 
    </host1> 
    <host2> 
    <add key="defaultPrinter" value="Overridden" /> 
    <add key="otherSetting" value="OtherSettingValue" /> 
    </host2> 
</printerOverrides> 

那麼這將工作:

var test = ConfigurationManager.GetSection("printerOverrides/host1") as NameValueCollection; 
Debug.WriteLine(test["defaultprinter"]); 

如果不能滿足您的需求,那麼您將需要創建自定義配置節類。看到How to create custom config section in app.config?

+0

從今天嘗試了很多,我得到了同樣的結論。我現在嘗試實現我的部分處理程序。基本上,我會回落到一個簡單的部分與鍵看上去就像 <添加鍵= 「hostname.defaultprinter」 值= 「OverriddenPrinterName」/> ... 這樣我就可以在處理程序中執行檢查。定義多個部分是不切實際的,因爲我將擁有10個以上的主機。 – Sebastian

相關問題