app.config中的自定义配置部分-XML属性与元素的关系

问题描述 投票:0回答:1

我已经有一个基于配置的自定义配置部分,例如:

  <DataSourcesConfig>
    <DataSources>
      <DataSource name="test1" connectionType="Ethernet_TCP_Client" protocolType="Serial" ipAddress="127.0.0.1" port="12345"/>
      <DataSource name="test2" connectionType="Ethernet_TCP_Client" protocolType="Serial" ipAddress="127.0.0.1" port="12346"/>
    </DataSources>
  </DataSourcesConfig>

但是我想知道是否支持以下内容-或在理想的情况下同时支持以下两者:

  <DataSourcesConfig>
    <DataSources>
      <DataSource>
        <name>test1</name>
        <connectionType>Ethernet_TCP_Client</connectionType>
        <protocolType>Serial</protocolType>
        <ipAddress>127.0.0.1</ipAddress>
        <port>12345</port>
      </DataSource>
      <DataSource>
        <name>test2</name>
        <connectionType>Ethernet_TCP_Client</connectionType>
        <protocolType>Serial</protocolType>
        <ipAddress>127.0.0.1</ipAddress>
        <port>12346</port>
      </DataSource>
    </DataSources>
  </DataSourcesConfig>

所以我有如下代码(正在工作)。在不进行自定义Xml解析的情况下支持第二个Xml示例是否可行?我可以看到一个开始DataSources.GetElementKey是一个问题,因为它引用了name作为属性而丢失,但这很大程度上是从示例代码中借用的,因此我并不是声称非常了解这些类。

public class DataSource : ConfigurationElement
{
    [ConfigurationProperty("name", IsRequired = true)]
    public string Name => this["name"] as string;

    [ConfigurationProperty("connectionType", IsRequired = true)]
    public string ConnectionType => this["connectionType"] as string;

    [ConfigurationProperty("protocolType", IsRequired = true)]
    public string ProtocolType => this["protocolType"] as string;

    [ConfigurationProperty("ipAddress", IsRequired = true)]
    public string IPAddress => this["ipAddress"] as string;

    [ConfigurationProperty("port", IsRequired = true)]
    public string Port => this["port"] as string;
}
public class DataSources
    : ConfigurationElementCollection
{
    public DataSource this[int index]
    {
        get
        {
            return base.BaseGet(index) as DataSource;
        }
        set
        {
            if (base.BaseGet(index) != null)
            {
                base.BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }

    public new DataSource this[string responseString]
    {
        get
        {
            return (DataSource)BaseGet(responseString);
        }
        set
        {
            if (BaseGet(responseString) != null)
            {
                BaseRemoveAt(BaseIndexOf(BaseGet(responseString)));
            }
            BaseAdd(value);
        }
    }

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

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((DataSource)element).Name;
    }
}

public class DataSourcesConfig : ConfigurationSection
{
    public static DataSourcesConfig GetConfig()
    {
        var o = ConfigurationManager.GetSection("DataSourcesConfig");
        return o as DataSourcesConfig;
    }

    [System.Configuration.ConfigurationProperty("DataSources")]
    [ConfigurationCollection(typeof(DataSources), AddItemName = "DataSource")]
    public DataSources DataSources
    {
        get
        {
            object o = this["DataSources"];
            return o as DataSources;
        }
    }
}
c# .net console-application app-config
1个回答
0
投票
据我所知,使用ConfigurationManager时无法将

values

放在app.config文件的xml节中>但是您有一个非常类似的选项来使用这样的配置结构:
© www.soinside.com 2019 - 2024. All rights reserved.