How to Create One or More Nested ConfigurationElementCollection items within your Custom ConfigurationSection

So recently I was trying to create nested ConfigurationElementCollection items within my custom ConfigurationSection like this:

 <Custom>  
   <Apps>  
    <App path="...">  
     <Methods>  
      <Method name="..." />  
      <Method name="..." />  
      <Method name="..." />  
     </Methods>  
    </App>  
    <App path="...">  
     <Methods>  
      <Method name="..." />  
      <Method name="..." />  
      <Method name="..." />  
     </Methods>  
    </App>  
    <App path="...">  
     <Methods>  
      <Method name="..." />  
      <Method name="..." />  
      <Method name="..." />  
     </Methods>  
    </App>  
   </Apps>  
  </Custom>  

Needless to say, I was pulling my hair out.  Finally, I found what I was looking for, so I figured I'd post my findings in such a way that you can copy/paste it straight into your code and away you go. 

I modified my app.config file as follows (I've changed the names to protect the innocent):

  <configSections>  
   <section name="Custom" type="MyCustom.Custom, MyCustom" />  
  </configSections>  




and then added the above XML as well.

Then, I used the following code to implement the custom configuration:

   public class Custom : ConfigurationSection  
   {  
     [ConfigurationProperty("Apps")]  
     public AppElementCollection Apps  
     {  
       get { return this["Apps"] as AppElementCollection; }  
     }  
   }  
   public class AppElementCollection : ConfigurationElementCollection  
   {  
     protected override ConfigurationElement CreateNewElement()  
     {  
       return new AppElement();  
     }  
     protected override object GetElementKey(ConfigurationElement element)  
     {  
       return ((AppElement)element).LocalName;  
     }  
     public override ConfigurationElementCollectionType CollectionType  
     {  
       get { return ConfigurationElementCollectionType.BasicMap; }  
     }  
     protected override string ElementName  
     {  
       get { return "App"; }  
     }  
     public AppElement this[int index]  
     {  
       get { return (AppElement)BaseGet(index); }  
       set  
       {  
         if (BaseGet(index) != null)  
         {  
           BaseRemoveAt(index);  
         }  
         BaseAdd(index, value);  
       }  
     }  
     new public AppElement this[string employeeID]  
     {  
       get { return (AppElement)BaseGet(employeeID); }  
     }  
     public bool ContainsKey(string key)  
     {  
       bool result = false;  
       object[] keys = BaseGetAllKeys();  
       foreach (object obj in keys)  
       {  
         if ((string)obj == key)  
         {  
           result = true;  
           break;  
         }  
       }  
       return result;  
     }  
   }  
   public class AppElement : ConfigurationElement  
   {  
     [ConfigurationProperty("path", IsRequired = true, IsKey = true)]  
     public string LocalName  
     {  
       get  
       {  
         return this["path"] as string;  
       }  
       set  
       {  
         this["path"] = value;  
       }  
     }  
     [ConfigurationProperty("Methods")]  
     public MethodElementCollection Methods  
     {  
       get  
       {  
         return this["Methods"] as MethodElementCollection;  
       }  
     }  
   }  
   public class MethodElementCollection : ConfigurationElementCollection  
   {  
     protected override ConfigurationElement CreateNewElement()  
     {  
       return new MethodElement();  
     }  
     protected override object GetElementKey(ConfigurationElement element)  
     {  
       return ((MethodElement)element).LocalName;  
     }  
     public override ConfigurationElementCollectionType CollectionType  
     {  
       get { return ConfigurationElementCollectionType.BasicMap; }  
     }  
     protected override string ElementName  
     {  
       get { return "Method"; }  
     }  
     public MethodElement this[int index]  
     {  
       get { return (MethodElement)BaseGet(index); }  
       set  
       {  
         if (BaseGet(index) != null)  
         {  
           BaseRemoveAt(index);  
         }  
         BaseAdd(index, value);  
       }  
     }  
     new public MethodElement this[string employeeID]  
     {  
       get { return (MethodElement)BaseGet(employeeID); }  
     }  
     public bool ContainsKey(string key)  
     {  
       bool result = false;  
       object[] keys = BaseGetAllKeys();  
       foreach (object obj in keys)  
       {  
         if ((string)obj == key)  
         {  
           result = true;  
           break;  
         }  
       }  
       return result;  
     }  
   }  
   public class MethodElement : ConfigurationElement  
   {  
     [ConfigurationProperty("name", IsRequired = true, IsKey = true)]  
     public string LocalName  
     {  
       get  
       {  
         return this["name"] as string;  
       }  
       set  
       {  
         this["name"] = value;  
       }  
     }  
   }  

I think that should be enough information to get you going.  :)

 

来源:http://tneustaedter.blogspot.com/2011/09/how-to-create-one-or-more-nested.html

posted @ 2014-10-13 18:49  烽火情怀  阅读(755)  评论(0编辑  收藏  举报