2017-08-16 82 views
2

使用VSTO Outlook加載項。我需要將配置參數存儲在XML文件中。我正在努力解決一些基本的配置文件加載問題。我希望一個新的觀點:C#XML配置文件自定義部分始終爲空

customConfiguration.xml

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <configSections> 
     <section name="CDSSettings" type="System.Configuration.NameValueSectionHandler" /> 
    </configSections> 

    <CDSSettings> 
    <add key="APIusername" value="myUser" /> 
    <add key="APIpassword" value="myPassword" /> 
    </CDSSettings> 

    <appSettings> 
     <add key="logLevel" value="0" /> 
    </appSettings> 
</configuration> 

代碼

ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
map.ExeConfigFilename = "customConfiguration.xml"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 

AppSettingsSection appSettingsSection = (config.GetSection("appSettings") as AppSettingsSection); 
// --> All ok 

ConfigurationSection CDSSettings = (ConfigurationSection)config.GetSection("CDSSettings"); 
// --> How to get the APIusername key? 

任何機會,我能避免XML解析器或SectionInformation.GetRawXml()?

回答

1

無法解釋爲什麼ConfigurationManager.GetSectionconfig.GetSection返回不同的結果object,可在第一種情況下轉化爲NameValueCollection,並且部分是DefaultSection in second

我建議創建一個自定義部分,並使用它:

public class CDSSettings : ConfigurationSection 
{ 
    [ConfigurationProperty("MyValues")] 
    public KeyValueConfigurationCollection MyValues 
    { 
     get { return (KeyValueConfigurationCollection) this["MyValues"]; } 
     set { this["MyValues"] = value; } 
    } 
} 

和配置將看起來像

<section name="CDSSettings" type="UCAddin.CDSSettings, UCAddin" /> 
... 
<CDSSettings> 
    <MyValues> 
    <add key="APIusername" value="myUser" /> 
    <add key="APIpassword" value="myPassword" /> 
    </MyValues> 
</CDSSettings> 

檢索代碼:

var CDSSettings = (CDSSettings)config.GetSection("CDSSettings"); 

在自定義部分的情況下你也可以指定不同類型的字段,例如 你可以有不同的命名元素:

public class Credentials : ConfigurationElement 
{ 
    [ConfigurationProperty("login")] 
    public string Login 
    { 
     get { return (string)this["login"]; } 
     set { this["login"] = value; } 
    } 
} 

名爲proerties

[ConfigurationProperty("credentials")] 
public Credentials Credentials 
{ 
    get { return (Credentials) this["credentials"]; } 
    set { this["credentials"] = value; } 
} 

和配置將看起來像

<CDSSettings> 
    <credentials login="testlogin" /> 
</CDSSettings> 

檢查this MSDN article更多的可能性

作爲的AppSettings 可以作爲默認集合財產登記

public class CDSSettings : ConfigurationSection 
{ 

    [ConfigurationProperty("", IsDefaultCollection = true)] 
    public KeyValueConfigurationCollection MyValues => 
       (KeyValueConfigurationCollection) this[string.Empty]; 
} 

,並有參數在應用程序設置

<CDSSettings> 
    <add key="login" value="User" /> 
</CDSSettings> 

但在代碼這些數據將會從屬性訪問(如果你不執行索引中該類)

var settings = (CDSSettings)config.GetSection("CDSSettings"); 
settings.MyValues 
+0

謝謝,看起來優雅。該代碼引發「無法投射類型爲」System.Configuration.DefaultSection「的對象以鍵入」UCAddin.CDSSettings「。」現在,但我認爲它應該是可以修復的。任何機會我可以跳過MyValues標籤?我希望XML儘可能地乾淨。 – Salim

+0

登錄用戶名密碼忘記密碼?添加到答案 – ASpirin

+0

添加其他可能的東西 – ASpirin