C# 读取自定义配置节时返回";无效的键值“;

C# 读取自定义配置节时返回";无效的键值“;,c#,.net,app-config,configurationmanager,C#,.net,App Config,Configurationmanager,使用ConfigurationManager读取app.config时遇到困难。我有一个自定义部分,它使用ConfigurationElementCollection 我的(精简的)XML: 尝试使用它: [TestMethod] public void TestConfigReader() { var searchSection = (SearchWeightSection)ConfigurationManager.GetSection("Custome

使用ConfigurationManager读取app.config时遇到困难。我有一个自定义部分,它使用ConfigurationElementCollection

我的(精简的)XML:

尝试使用它:

    [TestMethod]
    public void TestConfigReader()
    {
        var searchSection = (SearchWeightSection)ConfigurationManager.GetSection("CustomerMatching/SearchWeight");
        Assert.AreEqual(searchSection.SearchMethods["ByContactName"].Weight, "100");
    }
我的错误:

Test method BLL.UnitTests.Customer.CustomerMatchManagerTest.TestConfigReader threw exception: 
System.Configuration.ConfigurationErrorsException: Invalid key value. (C:\Users\michael\Documents\Visual Studio 2010\MyProject\BLL.UnitTests\bin\Debug\BLL.UnitTests.dll.config line 53)
at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at BLL.UnitTests.Customer.CustomerMatchManagerTest.TestConfigReader() in CustomerMatchManagerTest.cs: line 41

谢谢。

除了方法配置元素本身之外,您的代码看起来非常好

由于它是一个配置元素,属性需要将数据存储在基类“(ConfigurationElement)名称值集合中。否则键和值将不会初始化

public class Method: ConfigurationElement
{
    [ConfigurationProperty("SearchMethod", IsKey = true, IsRequired = true)]
    public string SearchMethod
    {
        get { return base["SearchMethod"] as string; }
        set { base["SearchMethod"] = value; }
    }

    [ConfigurationProperty("Weight", IsRequired = true)]
    public string Weight
    {
        get { return base["Weight"] as string; }
        set { base["Weight"] = value; }
    }

    //REST OF YOUR CLASS
}
希望这能有所帮助。

看看这个:这很有效
Test method BLL.UnitTests.Customer.CustomerMatchManagerTest.TestConfigReader threw exception: 
System.Configuration.ConfigurationErrorsException: Invalid key value. (C:\Users\michael\Documents\Visual Studio 2010\MyProject\BLL.UnitTests\bin\Debug\BLL.UnitTests.dll.config line 53)
at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult)
at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, ref Object result, ref Object resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at BLL.UnitTests.Customer.CustomerMatchManagerTest.TestConfigReader() in CustomerMatchManagerTest.cs: line 41
public class Method: ConfigurationElement
{
    [ConfigurationProperty("SearchMethod", IsKey = true, IsRequired = true)]
    public string SearchMethod
    {
        get { return base["SearchMethod"] as string; }
        set { base["SearchMethod"] = value; }
    }

    [ConfigurationProperty("Weight", IsRequired = true)]
    public string Weight
    {
        get { return base["Weight"] as string; }
        set { base["Weight"] = value; }
    }

    //REST OF YOUR CLASS
}