自定义app.config部分错误"无法识别的元素添加"

时间:2015-12-11 15:49:04

标签: c# wpf app-config

我有一个小应用程序,可以在我的SQL Server数据库中搜索可以使用它的所有字段中的给定值。其中一部分是自定义app.config部分,用于保存所有这些字段。但是,我在应用中的这一行收到错误:

var section = (DatabaseFieldSection)ConfigurationManager.GetSection("DatabaseFields");

的app.config:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="DatabaseFields" type="PartyFinder.DataAccess.DatabaseFieldSection, DataAccess"/>
  </configSections>
  <connectionStrings>
    <!-- Data removed for security purposes -->
  </connectionStrings>
  <DatabaseFields>
    <add Key="Person.FirstName (SV)" TableName="dbo.Person" ColumnName="FirstName" FieldType="SV" />
  </DatabaseFields>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
</configuration>

类:

using System;
using System.Configuration;

namespace PartyFinder.DataAccess
{
    public class DatabaseFieldElement : ConfigurationElement
    {
        [ConfigurationProperty("Key", IsKey = true, IsRequired = true)]
        public string Key
        {
            get { return (string)base["Key"]; }
        }

        [ConfigurationProperty("TableName", IsKey = false, IsRequired = true)]
        public string TableName
        {
            get { return (string)base["TableName"]; }
        }

        [ConfigurationProperty("ColumnName", IsKey = false, IsRequired = true)]
        public string ColumnName
        {
            get { return (string)base["ColumnName"]; }
        }

        [ConfigurationProperty("FieldType", IsKey = false, IsRequired = true)]
        public string FieldType
        {
            get { return (string)base["FieldType"]; }
        }
    }

    public class DatabaseFieldSection : ConfigurationSection
    {
        [ConfigurationProperty("DatabaseFields", IsDefaultCollection = true)]
        [ConfigurationCollection(typeof(DatabaseFieldCollection), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")]
        public DatabaseFieldCollection DatabaseFields
        {
            get { return ((DatabaseFieldCollection)base["DatabaseFields"]); }
        }
    }

    public class DatabaseFieldCollection : ConfigurationElementCollection
    {
        internal const string PropertyName = "Fields";

        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.AddRemoveClearMap;
            }
        }

        protected override string ElementName
        {
            get
            {
                return PropertyName;
            }
        }

        protected override bool IsElementName(string elementName)
        {
            return elementName.Equals(PropertyName, StringComparison.InvariantCultureIgnoreCase);
        }

        public override bool IsReadOnly()
        {
            return false;
        }

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

        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((DatabaseFieldElement)(element)).Key;
        }

        public DatabaseFieldElement this[int id]
        {
            get
            {
                return (DatabaseFieldElement)BaseGet(id);
            }
        }
    }
}

我做了很多搜索,到目前为止还没有任何工作。任何建议都非常感谢!

1 个答案:

答案 0 :(得分:3)

我通过添加父DatabaseConfig节点设法让以下内容在控制台应用中运行:

DatabaseFieldSection类:

public class DatabaseFieldSection : ConfigurationSection
{
    public static DatabaseFieldSection GetConfig()
    {
        return (DatabaseFieldSection)System.Configuration.ConfigurationManager.GetSection("DatabaseConfig") ?? new DatabaseFieldSection();
    }

    [System.Configuration.ConfigurationProperty("DatabaseFields")]
    [ConfigurationCollection(typeof(DatabaseFieldCollection), AddItemName = "add")]
    public DatabaseFieldCollection DatabaseFields
    {
        get
        {
            object o = this["DatabaseFields"];
            return o as DatabaseFieldCollection;
        }
    }
}

App.config

<configSections>
    <section name="DatabaseConfig" type="TestEnvironment.DBConfig.DatabaseFieldSection, TestEnvironment"/>
</configSections>
<DatabaseConfig>
    <DatabaseFields>
        <add Key="Person.FirstName (SV)" TableName="dbo.Person" ColumnName="FirstName" FieldType="SV" />
    </DatabaseFields>
</DatabaseConfig>

用法:

var config = DatabaseFieldSection.GetConfig();

似乎config <section />不能与config元素集合名称相同。例如DatabaseFields,它必须是:

  

部分&gt;收集&gt;项目

或者:

  

DatabaseConfig&gt; DatabaseFields&gt;添加

相关问题