我需要配置部分是这样的:
<myConfig>
<mySubConfig1>
<mySubSubConfig1 keyAttribute="value1">
<mySubSubConfig1Element keyAttribute="value1"/>
<mySubSubConfig1Element keyAttribute="value2"/>
</mySubSubConfig1>
<mySubSubConfig1 keyAttribute="value2">
<mySubSubConfig1Element keyAttribute="value1"/>
</mySubSubConfig1>
</mySubConfig1>
<mySubConfig2>
<mySubSubConfig2 keyAttribute="value1">
<mySubSubConfig2Element keyAttribute="value1"/>
<mySubSubConfig2Element keyAttribute="value2"/>
</mySubSubConfig2>
<mySubSubConfig2 keyAttribute="value2">
<mySubSubConfig2Element keyAttribute="value1"/>
</mySubSubConfig2>
</mySubConfig2>
<mySubConfig3>
<mySubSubConfig3 keyAttribute="value1">
<mySubSubConfig3Element keyAttribute="value1"/>
<mySubSubConfig3Element keyAttribute="value2"/>
</mySubSubConfig3>
<mySubSubConfig3 keyAttribute="value2">
<mySubSubConfig3Element keyAttribute="value1"/>
</mySubSubConfig3>
</mySubConfig3>
</myConfig>
我还没有找到魔法,将使用旧允许这种withoug IConfigurationSectionHandler
接口。 有谁知道如何做到这一点?
这是确定我如果myConfig
和mySubConfign
是ConfigurationSectionGroup
或ConfigurationSection
。
另外,如果它很重要,这将是从web.config中使用。
在您的示例配置文件, myConfig
将是从继承的类ConfigurationSection
名为三个属性mySubConfig1
, mySubConfig2
和mySubConfig3
。
的类型的mySubConfig1
属性(以及图2和3)将是从继承的类ConfigurationElementCollection
,实现IEnumerable<ConfigElement>
并与装饰ConfigurationCollection
(其中“AddItemName”属性设置为“mySubSubConfig1”)。
下面是我在生产部署中使用的方法的一个完整样本实现。 一定要包括System.Configuration 组装 。 (这是一个有点混乱,因为System.Configuration命名空间中的其他assmeblies定义的,但你必须包括System.Configuration 组件使用下面的代码。)
这里有自定义配置类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
namespace ConfigTest {
class CustomConfigSection : ConfigurationSection {
[ConfigurationProperty( "ConfigElements", IsRequired = true )]
public ConfigElementsCollection ConfigElements {
get {
return base["ConfigElements"] as ConfigElementsCollection;
}
}
}
[ConfigurationCollection( typeof( ConfigElement ), AddItemName = "ConfigElement" )]
class ConfigElementsCollection : ConfigurationElementCollection, IEnumerable<ConfigElement> {
protected override ConfigurationElement CreateNewElement() {
return new ConfigElement();
}
protected override object GetElementKey( ConfigurationElement element ) {
var l_configElement = element as ConfigElement;
if ( l_configElement != null )
return l_configElement.Key;
else
return null;
}
public ConfigElement this[int index] {
get {
return BaseGet( index ) as ConfigElement;
}
}
#region IEnumerable<ConfigElement> Members
IEnumerator<ConfigElement> IEnumerable<ConfigElement>.GetEnumerator() {
return ( from i in Enumerable.Range( 0, this.Count )
select this[i] )
.GetEnumerator();
}
#endregion
}
class ConfigElement : ConfigurationElement {
[ConfigurationProperty( "key", IsKey = true, IsRequired = true )]
public string Key {
get {
return base["key"] as string;
}
set {
base["key"] = value;
}
}
[ConfigurationProperty( "SubElements" )]
public ConfigSubElementsCollection SubElements {
get {
return base["SubElements"] as ConfigSubElementsCollection;
}
}
}
[ConfigurationCollection( typeof( ConfigSubElement ), AddItemName = "ConfigSubElement" )]
class ConfigSubElementsCollection : ConfigurationElementCollection, IEnumerable<ConfigSubElement> {
protected override ConfigurationElement CreateNewElement() {
return new ConfigSubElement();
}
protected override object GetElementKey( ConfigurationElement element ) {
var l_configElement = element as ConfigSubElement;
if ( l_configElement != null )
return l_configElement.Key;
else
return null;
}
public ConfigSubElement this[int index] {
get {
return BaseGet( index ) as ConfigSubElement;
}
}
#region IEnumerable<ConfigSubElement> Members
IEnumerator<ConfigSubElement> IEnumerable<ConfigSubElement>.GetEnumerator() {
return ( from i in Enumerable.Range( 0, this.Count )
select this[i] )
.GetEnumerator();
}
#endregion
}
class ConfigSubElement : ConfigurationElement {
[ConfigurationProperty( "key", IsKey = true, IsRequired = true )]
public string Key {
get {
return base["key"] as string;
}
set {
base["key"] = value;
}
}
}
}
下面是App.config文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="CustomConfigSection" type="ConfigTest.CustomConfigSection,ConfigTest" />
</configSections>
<CustomConfigSection>
<ConfigElements>
<ConfigElement key="Test1">
<SubElements>
<ConfigSubElement key="-SubTest1.1" />
<ConfigSubElement key="-SubTest1.2" />
</SubElements>
</ConfigElement>
<ConfigElement key="Test2">
<SubElements>
<ConfigSubElement key="-SubTest2.1" />
<ConfigSubElement key="-SubTest2.2" />
</SubElements>
</ConfigElement>
</ConfigElements>
</CustomConfigSection>
</configuration>
最后,这里是其访问和使用配置文件中的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
namespace ConfigTest {
class Program {
static void Main( string[] args ) {
var l_configSettings = (CustomConfigSection) ConfigurationManager.GetSection( "CustomConfigSection" );
foreach ( var l_element in l_configSettings.ConfigElements.AsEnumerable() ) {
Console.WriteLine( l_element.Key );
foreach ( var l_subElement in l_element.SubElements.AsEnumerable() ) {
Console.WriteLine( l_subElement.Key );
}
}
Console.WriteLine( "Press any key..." );
Console.ReadKey( true );
}
}
}
一个重量更轻的替代是在自己的博客写的苏尼尔·辛格:
http://blogs.quovantis.com/net-creating-a-custom-configuration-section-that-contains-a-collection-of-collections/
文章来源: How to Create a Configuration Section That Contains a Collection of Collections?