app.config的自定义配置 – 部分集合?

我的脑袋非常糟糕! 我以前做过这个,但不是“深入”或复杂,我已经尝试了不同的方法来实现这一点,但都失败了。

所以,这是app.config中我想要的自定义XML:

                         

所以Profile的集合,每个配置文件都有一个子元素集合(Components是一个集合,Component是一个元素)

但是我目前除了多个配置文件之外还有其他所有function。 我有点看到问题,但不知道如何“修复”它。

码:

 public class Profile : ConfigurationSection { [ConfigurationProperty("Name", IsRequired=true)] public string Name { get { return base["Name"] as string; } set { base["Name"] = value; } } [ConfigurationProperty("Components")] public ComponentCollection Components { get { return ((ComponentCollection)(base["Components"])); } } [ConfigurationProperty("Databases")] public DatabaseCollection Databases { get { return ((DatabaseCollection)(base["Databases"])); } } } [ConfigurationCollection(typeof(Component), AddItemName="Component")] public class ComponentCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new Component(); } protected override object GetElementKey(ConfigurationElement element) { return ((Component)(element)).Name; } public Component this[int idx] { get { return base.BaseGet(idx) as Component; } set { if (base.BaseGet(idx) != null) { base.BaseRemoveAt(idx); } this.BaseAdd(idx, value); } } public Component this[string key] { get { return base.BaseGet(key) as Component; } set { if (base.BaseGet(key) != null) { base.BaseRemove(key); } this.BaseAdd(this.Count, value); } } } public class Component : ConfigurationElement { [ConfigurationProperty("Type", IsRequired = true)] public string Type { get { return this["Type"] as string; } set { this["Type"] = value; } } [ConfigurationProperty("Name", IsRequired = true, IsKey = true)] public string Name { get { return this["Name"] as string; } set { this["Name"] = value; } } [ConfigurationProperty("ServiceName", IsRequired = false)] public string ServiceName { get { return this["ServiceName"] as string; } set { this["ServiceName"] = value; } } } [ConfigurationCollection(typeof(Database), AddItemName = "Database")] public class DatabaseCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new Database(); } protected override object GetElementKey(ConfigurationElement element) { return ((Database)(element)).Name; } public Database this[int idx] { get { return base.BaseGet(idx) as Database; } set { if (base.BaseGet(idx) != null) { base.BaseRemoveAt(idx); } this.BaseAdd(idx, value); } } public Database this[string key] { get { return base.BaseGet(key) as Database; } set { if (base.BaseGet(key) != null) { base.BaseRemove(key);; } this.BaseAdd(this.Count, value); } } } public class Database : ConfigurationElement { [ConfigurationProperty("Name", IsKey = true, IsRequired = true)] public string Name { get { return this["Name"] as string; } set { this["Name"] = value; } } [ConfigurationProperty("Connection", IsKey = false, IsRequired = true)] public string Connection { get { return this["Connection"] as string; } set { this["Connection"] = value; } } } 

您需要将配置部分提高一级。

 public class Profiles : ConfigurationSection { [ConfigurationProperty("Profile")] public ProfileCollection Profile { get { return this["profile"] as ProfileCollection; } } } 

这是我创建的一个部分。 您应该能够通过以下方式让您的工作:

 public class ImportConfiguration : ConfigurationSection { [ConfigurationProperty("importMap")] public ImportMapElementCollection ImportMap { get { return this["importMap"] as ImportMapElementCollection; } } } public class ImportColumnMapElement : ConfigurationElement { [ConfigurationProperty("localName", IsRequired = true, IsKey = true)] public string LocalName { get { return this["localName"] as string; } set { this["localName"] = value; } } [ConfigurationProperty("sourceName", IsRequired = true)] public string SourceName { get { return this["sourceName"] as string; } set { this["sourceName"] = value; } } } public class ImportMapElementCollection : ConfigurationElementCollection { public ImportColumnMapElement this[object key] { get { return base.BaseGet(key) as ImportColumnMapElement; } } public override ConfigurationElementCollectionType CollectionType { get { return ConfigurationElementCollectionType.BasicMap; } } protected override string ElementName { get { return "columnMap"; } } protected override bool IsElementName(string elementName) { bool isName = false; if (!String.IsNullOrEmpty(elementName)) isName = elementName.Equals("columnMap"); return isName; } protected override ConfigurationElement CreateNewElement() { return new ImportColumnMapElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((ImportColumnMapElement)element).LocalName; } } 

你正确实现,除了你需要一个额外的级别。 将配置文件从ConfigurationSection更改为ConfigurationElement,然后创建包含配置文件项集合的ConfigurationSection配置文件。

这是自动化测试的一个很好的案例,调试配置部分没有是一个王室的痛苦。