我已经有一个基于配置的自定义配置部分,例如:
<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;
}
}
}
ConfigurationManager
时无法将values
放在app.config文件的xml节中>但是您有一个非常类似的选项来使用这样的配置结构: