2010-04-23 52 views
14

有沒有辦法讓我包含一個簡單的字符串數組,或者在我的ConfigurationSection的自定義子類中列出<字符串>? (或者簡單的數據對象的數組或通用列表,對於這個問題?)如何在ConfigurationSection中包含簡單集合

我開始熟悉新的(和詳細的)ConfigurationSection,ConfigurationElement和ConfigurationElementCollection類,但我決不是專家呢。

看起來像ConfigurationSection應該自己處理簡單的集合/列表,而不必爲每一個都創建一個自定義的ConfigurationElementCollection子類。但是我沒有在網上找到任何有關這種能力的參考。

編輯:接受丹的回答作爲答案,因爲它可能是我最接近的「舊式」configSections。我總是發現任何XmlSerializable對象都可以很容易地變成configSection,這很簡單,靈活和優雅。我相信新的框架更強大;不過很遺憾,它對於簡單的配置構造來說太麻煩了,我們簡化爲返回到String.Split()。

回答

8

好的,你問簡單。那麼,存儲一系列字符串最簡單的方法就是使用分隔列表(比如逗號分隔)。這樣你可以將它存儲在一個元素中(比如在appSettings中)。

<add key="weekDays" value="Monday,Tuesday,Wednesday,Thursday,Friday"/> 

當然,這有缺陷,但在大多數情況下,對於一個簡單的列表很適用。然後您可以使用String.Split()將其轉換回數組/列表。

否則,您會回到ConfigurationSection元素,我同意這些元素非常詳細且笨拙。但我不知道任何其他方式,我害怕(但很高興被證明是錯誤的!)。

+0

丹D - 謝謝,但你是對的,我不是在尋找一些簡單的東西! :)我之前使用過分隔列表和String.Split,我確信我會再次使用它。但我希望有更高雅的東西。也許別人會回覆我們錯過的東西。 – mikemanne 2010-04-23 14:07:34

+0

我不這麼認爲,但有時候開發人員會忽視這些顯而易見的事情。這是我們的本性! – 2010-04-23 14:39:36

19

下面是一個簡單的例子。

//START CODE 


//MyCompany.MyProject.csproj which results in MyCompany.MyProject.dll 
//Add a Folder called "Configuration" 

namespace MyCompany.MyProject.Configuration 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 

    using System.Configuration; 


    public class TransformationToDirectoryMapping : ConfigurationElement 
    { 

     private const string FRIENDLY_NAME = "FriendlyName"; 
     private const string PICKUP_FOLDER = "PickupFolder"; 

     [ConfigurationProperty(FRIENDLY_NAME, DefaultValue = "", IsKey = false, IsRequired = true)] 
     public string FriendlyName 
     { 
      get 
      { 
       return ((string)(base[FRIENDLY_NAME])); 
      } 
      set 
      { 
       base[FRIENDLY_NAME] = value; 
      } 
     } 

     [ConfigurationProperty(PICKUP_FOLDER, DefaultValue = "", IsKey = true, IsRequired = true)] 
     public string PickupFolder 
     { 
      get 
      { 
       return ((string)(base[PICKUP_FOLDER])); 
      } 
      set 
      { 
       base[PICKUP_FOLDER] = value; 
      } 
     } 



    } 

    //----------------------------------------------------------------------- 

    //----------------------------------------------------------------------- 

    [ConfigurationCollection(typeof(TransformationToDirectoryMapping))] 
    public class TransformationToDirectoryMappingCollection : ConfigurationElementCollection 
    { 

     protected override ConfigurationElement CreateNewElement() 
     { 
      return new TransformationToDirectoryMapping(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) 
     { 
      return ((TransformationToDirectoryMapping)(element)).PickupFolder; 
     } 


     public TransformationToDirectoryMapping this[int idx] 
     { 
      get 
      { 
       return (TransformationToDirectoryMapping)BaseGet(idx); 
      } 
     } 

     new public TransformationToDirectoryMapping this[string key] 
     { 
      get 
      { 
       return (TransformationToDirectoryMapping)BaseGet(key); 
      } 
     } 
    } 

    //----------------------------------------------------------------------- 

    //----------------------------------------------------------------------- 

    public class TransformationToDirectoryMappingConfigSection : ConfigurationSection 
    { 
     private const string TRANSFORMATION_TO_DIRECTORY_MAPPINGS = "TransformationToDirectoryMappings"; 

     [ConfigurationProperty(TRANSFORMATION_TO_DIRECTORY_MAPPINGS)] 
     public TransformationToDirectoryMappingCollection TransformationToDirectoryMappingItems 
     { 
      get { return ((TransformationToDirectoryMappingCollection)(base[TRANSFORMATION_TO_DIRECTORY_MAPPINGS])); } 
     } 
    } 

    //----------------------------------------------------------------------- 

    //----------------------------------------------------------------------- 

    public static class MyRetriever 
    { 
     public const string MAPPINGS_CONFIGURATION_SECTION_NAME = "TransformationToDirectoryMappingsSection"; 

     public static TransformationToDirectoryMappingCollection GetTheCollection() 
     { 
      TransformationToDirectoryMappingConfigSection mappingsSection = (TransformationToDirectoryMappingConfigSection)ConfigurationManager.GetSection(MAPPINGS_CONFIGURATION_SECTION_NAME); 
      if (mappingsSection != null) 
      { 
       return mappingsSection.TransformationToDirectoryMappingItems; 
      } 
      return null; // OOPS! 

     } 
    } 

} 

// XML的配置文件:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="TransformationToDirectoryMappingsSection" type="MyCompany.MyProject.Configuration.TransformationToDirectoryMappingConfigSection, MyCompany.MyProject"/> 
    </configSections> 

    <TransformationToDirectoryMappingsSection> 
    <TransformationToDirectoryMappings> 
     <add FriendlyName="Hello" PickupFolder="C:\WUWUTemp\pickups\pickup11\" /> 
     <add FriendlyName="GoodBye" PickupFolder="C:\WUWUTemp\pickups\pickup12\" /> 
    </TransformationToDirectoryMappings> 
    </TransformationToDirectoryMappingsSection> 
</configuration> 
+0

感謝您的回覆 - 特別是一個相對較舊的問題。 :)不幸的是,這仍然不是我想要的。你有一個1st-class對象數組,每個對象包含一對字符串。我想要的只是一串字符串。使用「舊式」配置節,我能夠做到這一點,而無需創建自定義對象。我希望有一種方法可以在新的配置框架內完成這些工作,而不必創建一個對象來實現List 。 – mikemanne 2010-07-30 17:48:03

+0

我用過它。爲我節省了很多時間。一個調整:公共靜態只讀字符串MAPPINGS_CONFIGURATION_SECTION_NAME =「TransformationToDirectoryMappingsSection」;應該是公共常量字符串MAPPINGS_CONFIGURATION_SECTION_NAME =「TransformationToDirectoryMappingsSection」; – 2017-11-12 20:55:42

+0

鷹眼細節獎去__JDN_____!哈哈,你有我。我改變了它。很高興幫助。 – granadaCoder 2017-11-13 14:59:04

10

應用程序設置架構

http://msdn.microsoft.com/en-us/library/8eyb2ct1.aspx

好了,舊的文章,但我記得它,當我碰到一個來類似的情況:

...

如果您轉到Project/Project Properties(在VS2008或VS2010中)。 有一個「設置」選項卡。

如果你添加一個新值....

其中一種類型叫做: System.Collections.Specialized.StringCollection

給它一個名稱(我用 「FavoriteColors」)。

設置類型(如上所述)。

設置值。

「字符串集合編輯器」說「輸入集合中的字符串(每行一個)」。

我進入:

黑色

這將一些XML添加到您的app.config文件。

<setting name="FavoriteColors" serializeAs="Xml"> 
     <value> 
      <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
       <string>red</string> 
       <string>yellow</string> 
       <string>black</string> 
       <string>white</string> 
      </ArrayOfString> 
     </value> 
    </setting> 

(你會好起來的一步步去,而不是粘貼上面的XML,因爲(爲了簡潔,)我沒有所有的XML添加到這個職位所產生。

你應該能夠通過代碼「獲得在」值是這樣的:

private void ShowMyFavoriteColors() 
{ 
      Properties.Settings.Default.FavoriteColors.Cast<string>().ToList().ForEach(myfavcolor => 
      { 
       string temp = myfavcolor; 
      }); 
} 

注意,上述步驟會產生爲您創建下面的C#代碼(自動代碼....這是你創建代碼) 但代碼看就像這樣:

 [global::System.Configuration.ApplicationScopedSettingAttribute()] 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
     [global::System.Configuration.DefaultSettingValueAttribute(@"<?xml version=""1.0"" encoding=""utf-16""?> 
<ArrayOfString xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> 
    <string>red</string> 
    <string>yellow</string> 
    <string>black</string> 
    <string>white</string> 
</ArrayOfString>")] 
     public global::System.Collections.Specialized.StringCollection FavoriteColors { 
      get { 
       return ((global::System.Collections.Specialized.StringCollection)(this["FavoriteColors"])); 
      } 
     } 
    } 
} 
+0

感謝您的迴應 - 這確實是一箇舊帖子!我實際上已經不再是啓發它的項目了。 :)在我寫這個問題的時候,我意識到你在這裏概述的技術,所以我一定有一些理由不使用它。但對於我的生活,我不記得爲什麼。當我有機會的時候,我會多玩一點,或者在帖子上標出答案,或者提供更多信息,說明爲什麼它不適合我的需求。再次感謝! – mikemanne 2011-04-11 21:19:58

+0

糟糕 - 剛剛意識到我已經標記了這個答案,我不想撤銷它。但我肯定會讚揚你的迴應。 :) – mikemanne 2011-04-11 21:22:00

2

我知道這個問題已經很久很久以前...回答,但我的「的ConfigurationElement」類,用於字符串集合,我通常做到以下幾點:

[ConfigurationProperty("myStringCollectionProperty", DefaultValue = "")] 
[TypeConverter(typeof(CommaDelimitedStringCollectionConverter))] 
public StringCollection MyStringCollectionProperty 
{ 
    get { return (StringCollection)this["myStringCollectionProperty"]; } 
    set { this["myStringCollectionProperty"] = value; } 
} 

你可以從這個屬性獲得一個字符串列表

List<string> myStrings = config.MyStringCollectionProperty.Cast<string>.ToList() 
相關問題