title: Reading custom config sections returns "Invalid Key Value"
body: <p>I'm having difficulties reading an app.config using the ConfigurationManager.  I have a custom section, which uses a ConfigurationElementCollection.</p>
  
  <p>My (cut-down) XML:</p>
  
  <pre><code>&lt;configuration&gt;
      &lt;configSections&gt;
          &lt;sectionGroup name ="CustomerMatching"&gt;
              &lt;section name="SearchWeight" type="BLL.Contracts.Helpers.CustomerMatching.SearchWeightSection, BLL.Contracts"/&gt;
          &lt;/sectionGroup&gt;
      &lt;/configSections&gt;
  
      &lt;CustomerMatching&gt;
          &lt;SearchWeight&gt;
              &lt;methods&gt;
                  &lt;method SearchMethod="ByContactName" Weight="100"/&gt; &lt;!--Line 53, referenced in Error --&gt;
                  &lt;method SearchMethod="ByBusinessName" Weight="250"/&gt;
                  &lt;method SearchMethod="ByPostcode" Weight="250"/&gt;
                  &lt;method SearchMethod="ByMobile" Weight="500"/&gt;
                  &lt;method SearchMethod="ByLandline" Weight="500"/&gt;
                  &lt;method SearchMethod="ByCompCharNo" Weight="850"/&gt;
              &lt;/methods&gt;
          &lt;/SearchWeight&gt;
      &lt;/CustomerMatching&gt;
  &lt;/configuration&gt;
  </code></pre>
  
  <p>My Configuration classes:</p>
  
  <pre><code>public class SearchWeightSection: ConfigurationSection
  {
      [ConfigurationProperty("methods", IsRequired = true)]
      [ConfigurationCollection(typeof(SearchMethods), AddItemName = "method", CollectionType =  ConfigurationElementCollectionType.BasicMap)]
      public SearchMethods SearchMethods
      {
          get { return (SearchMethods) base["methods"]; }
      }
  }
  
  public class SearchMethods: ConfigurationElementCollection
  {
      protected override ConfigurationElement CreateNewElement()
      {
          return new Method();
      }
  
      protected override object GetElementKey(ConfigurationElement element)
      {
          var method = (Method) element;
  
          return method.SearchMethod;
      }
  
      public new Method this[string index]
      {
          get { return (Method)BaseGet(index); }
  
      }
  }
  
  public class Method: ConfigurationElement
  {
      [ConfigurationProperty("SearchMethod", IsKey = true, IsRequired = true)]
      public string SearchMethod { get; set; }
  
      [ConfigurationProperty("Weight", IsRequired = true)]
      public string Weight { get; set; }
  
      public Method(string searchMethod, string weight)
      {
          SearchMethod = searchMethod;
          Weight = weight;
      }
  
      public Method()
      {
  
      }
  }
  </code></pre>
  
  <p>Trying to use it:</p>
  
  <pre><code>    [TestMethod]
      public void TestConfigReader()
      {
          var searchSection = (SearchWeightSection)ConfigurationManager.GetSection("CustomerMatching/SearchWeight");
          Assert.AreEqual(searchSection.SearchMethods["ByContactName"].Weight, "100");
      }
  </code></pre>
  
  <p>My error:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>Thanks.</p>