How to include simple collections in ConfigurationSection

前端 未结 4 573
不思量自难忘°
不思量自难忘° 2020-12-20 11:49

Is there a way for me to include a simple array of strings, or List on my custom subclass of ConfigurationSection? (Or an array or generic list of simple data

相关标签:
4条回答
  • 2020-12-20 12:14

    Application Settings Architecture

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

    Ok, an old post, but I remembered it when I came across a similar situation:

    ...

    If you go to Project / Project Properties (in VS2008 or VS2010). There is a "Settings" tab.

    If you add a new value....

    One of the types is called: System.Collections.Specialized.StringCollection

    Give it a name (I used "FavoriteColors").

    Set the type (as instructed above).

    Set the value(s).

    The "String Collection Editor" says "Enter the strings in the collection (one per line)".

    I entered:

    Red

    Yellow

    Black

    White

    This will add some xml to your app.config file.

        <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>
    

    (You'll be better off going through the steps rather than pasting the xml above, because (for conciseness) I did not add all the xml to this post that is generated.

    You should be able to "get at" the values via code like this:

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

    Note, the steps above will produce the below C# code (auto code created for you.... it is not code you create) but the code looks like this:

            [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 讨论(0)
  • 2020-12-20 12:21

    OK, you asked for simple. Well, the simplest way to store a series of strings would be to use a delimited list (say, comma separated). That way you can store it in just one element (say in appSettings).

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

    Of course, this has drawbacks but in most cases works well for a simple list. You can then use String.Split() to convert it back to an array/list.

    Otherwise you are back to ConfigurationSection elements which, I agree, are very verbose and clumsy to work with. But I don't know of any other way, I'm afraid (but am happy to be proved wrong!).

    0 讨论(0)
  • 2020-12-20 12:28

    I know that the question has been answered long time ago... but in my 'ConfigurationElement' classes, for string collection, I usually do the following:

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

    And you can get a string list from this property with

    List<string> myStrings = config.MyStringCollectionProperty.Cast<string>.ToList()
    
    0 讨论(0)
  • 2020-12-20 12:36

    Here's a simple example.

    //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 for config file:

    <?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 讨论(0)
提交回复
热议问题