具有基本类型的ConfigurationElementCollection

时间:2013-03-01 20:48:48

标签: c# app-config system.configuration

我正在使用System.Configuration命名空间类型来存储我的应用程序的配置。我需要存储一组原始类型(System.Double)作为该配置的一部分。创建以下内容似乎有点过分了:

[ConfigurationCollection(typeof(double), AddItemName="TemperaturePoint", 
    CollectionType=ConfigurationElementCollectionType.BasicMap)]
class DoubleCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return // Do I need to create a custom ConfigurationElement that wraps a double?
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return // Also not sure what to do here
    }
}

我无法想象我是第一个遇到这个问题的人。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

没有明确的“嘿,我想在这里填写一个值列表”处理程序,但你有几个选择:

实现自定义IConfigurationSectionHandler(比元素集合更简单等)并通过以下方式引用:

<configSections>
    <sectionGroup name="mysection" type="type of handler"/>
</configSections>

<mysection>
  some xml representation of values
</mysection>

在其中一个现有处理程序上回送,例如SingleTagSectionHandler - 这是一个毛茸茸的单行程序,它从配置文件中的此条目中提取一组值:

<configuration>
    <configSections>
        <section name="TemperaturePoints" 
             type="System.Configuration.SingleTagSectionHandler" 
             allowLocation="true" 
             allowDefinition="Everywhere"/>
    </configSections>

    <TemperaturePoints values="1,2,3,4,5,6,7,8,9,10"/>
</configuration>


var values = ((string)((Hashtable)ConfigurationManager
     .GetSection("TemperaturePoints"))["values"])
     .Split(',')
     .Select(double.Parse);

或者分开一点:

var section = (Hashtable)ConfigurationManager.GetSection("TemperaturePoints");
var packedValues = (string)section["values"];
var unpackedValues = packedValues.Split(',');
var asDoubles = unpackedValues.Select(double.Parse).ToArray();

答案 1 :(得分:3)

我能够在没有太多定制的情况下使用它。它类似于JerKimball的答案,但我避免使用ConfigurationProperty的TypeConverter属性处理自定义字符串处理。

我的自定义配置部分实现:

using System.Configuration;
using System.ComponentModel;

class DomainConfig : ConfigurationSection
{     

    [ConfigurationProperty("DoubleArray")]
    [TypeConverter(typeof(CommaDelimitedStringCollectionConverter))]
    public CommaDelimitedStringCollection DoubleArray
    {
        get { return (CommaDelimitedStringCollection)base["DoubleArray"]; }
    }
}

如何使用:

var doubleValues = from string item in configSection.DoubleArray select double.Parse(item);

配置文件:

<DomainConfig DoubleArray="1.0,2.0,3.0"></DomainConfig>