c# - 自定义 ConfigurationSection 中无法识别的元素异常

标签 c# app-config .net-4.5.2

问题是,正如标题所说,每当我尝试从我的 .config 文件加载自定义 CustomConfiguration 部分时,我都会遇到异常。我尝试加载的 app.config 文件如下所示。

....
<configSections>
    <sectionGroup name="MainSection">
        ...
        <section name="Directories" type="MyNamespace.DirectoriesSettings, Assembly"/>
    </sectionGroup>
</configSections>
....

<MainSection>
    ...
    <Directories Count="1">
      <Directory id="1" Path="Some\Path" Working="And\Another\Path" Country="US"/>
    </Directories>

</MainSection>
....

代码

namespace MyNamespace
{
    internal class DirectoriesSettings : ConfigurationSection
    {
        [ConfigurationProperty("Count")]
        public int Count { get { return Convert.ToInt32(base["Count"]); } }

        [ConfigurationProperty("Directories", IsDefaultCollection = true, IsRequired = true)]
        [ConfigurationCollection(typeof(DirectoryElement), AddItemName = "Directory", CollectionType = ConfigurationElementCollectionType.BasicMap)]
        public DirectoryElementCollection Directories { get { return (DirectoryElementCollection)base["Directories"]; } }

    }

    internal class DirectoryElementCollection : ConfigurationElementCollection
    {        
        protected override ConfigurationElement CreateNewElement()
        {
            return new DirectoryElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((DirectoryElement)element).Id;
        }
    }

    internal class DirectoryElement : ConfigurationElement
    {
        [ConfigurationProperty("id", IsKey = true, IsRequired = true)]
        public int Id
        {
            get { return Convert.ToInt32(this["id"]); }
            set { this["id"] = value; }
        }

        [ConfigurationProperty("Path", IsKey = false, IsRequired = true)]
        public string Path
        {
            get { return Convert.ToString(this["Path"]); }
            set { this["Path"] = value; }
        }

        [ConfigurationProperty("Working", IsKey = false, IsRequired = true)]
        public string Working
        {
            get { return Convert.ToString(this["Working"]); }
            set { this["Working"] = value; }
        }

        [ConfigurationProperty("Country", IsKey = false, IsRequired = true)]
        public string Country
        {
            get { return Convert.ToString(this["Country"]); }
            set { this["Country"] = value; }
        }
    }
}

以及使用它的代码

class SettingsContainer
{
    private const string PARENT_SECTION = "MainSection";

    ...
    private DirectoriesSettings _directoriesSettings;
    public DirectoriesSettings Directories { get { return _directoriesSettings; } }
    ...



    public SettingsContainer()
    {
        ...
        _directoriesSettings = (DirectoriesSettings)ConfigurationManager.GetSection(string.Format("{0}/Directories", PARENT_SECTION));
        ...
    }

}

每当我尝试设置 _directoriesSettings 变量时都会抛出异常(无法识别的元素“目录”)。

我认为我做对了,但显然我遗漏了什么。

任何帮助将不胜感激。

最佳答案

解决方案:

我找到了我的问题所在。

DirectoriesSettings 类中的属性 Directories 应该如下所示

[ConfigurationCollection(typeof(DirectoryElement), AddItemName = "Directory", CollectionType = ConfigurationElementCollectionType.BasicMap)]
[ConfigurationProperty("", IsDefaultCollection = true, IsRequired = true)]  
public DirectoryElementCollection Directories { get { return (DirectoryElementCollection)this[""]; } }      

代替

[ConfigurationCollection(typeof(DirectoryElement), AddItemName = "Directory", CollectionType = ConfigurationElementCollectionType.BasicMap)]
[ConfigurationProperty("Directories", IsDefaultCollection = true, IsRequired = true)]
public DirectoryElementCollection Directories { get { return (DirectoryElementCollection)base["Directories"]; } }

关于c# - 自定义 ConfigurationSection 中无法识别的元素异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982182/

相关文章:

c# - 如何创建包含前景色等属性的 Cha 信息数组?

c# - 在 DotLiquid 中编写递归循环

oracle - 部署和配置 ODP.NET,使其无需安装 Entity Framework 即可工作

c# - 为什么 Json.NET 需要 System.Xml.Linq v5.0.5 来序列化一个简单的对象?

c# - NHibernate 中的一对多

c# - 如何使用 jQuery 数据表和 Controller 内的 HTML 渲染在 .Net MVC 中实现服务器端处理

visual-studio-2008 - 当我没有 app.config 文件时编译器告诉我 "Consider app.config remapping"时我应该更改什么?

azure - 在 Azure 辅助角色启动时更新 app.config

c# - 共享对象上下文任务

c# - 调用一个方法如果耗时太长则取消并返回调用方法