2012-01-24 38 views
4

我試圖創建遵循以下遞歸結構的自定義配置節:遞歸自定義配置在C#

<monitorSettings> 
    <monitor description="description1" /> 
    <monitor description="description2" /> 
    <monitor description="description3"> 
     <monitor description="description3.1" /> 
     <monitor description="description3.2" /> 
    </monitor> 
</monitorSettings> 

這可能嗎?我不知道我將如何佈置配置類。

我有以下的顯示器:

public class Monitor : ConfigurationElement 
{ 
    [ConfigurationProperty("description", IsRequired = true)] 
    public String Description 
    { 
     get 
     { 
      return (String)this["description"]; 
     } 
     set 
     { 
      this["description"] = value; 
     } 
    } 
} 

我需要什麼補充,使之遞歸?

回答

1

您可以通過類似以下的(細微的變化上面的一個)一個配置文件,這樣做:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="monitorSettings" type="RecursiveCustomConfiguration.MonitorConfig, RecursiveCustomConfiguration"/> 
    </configSections> 
    <monitorSettings> 
    <monitors> 
     <monitor description="description1" /> 
     <monitor description="description2" /> 
     <monitor description="description3"> 
     <monitors> 
      <monitor description="description3.1" /> 
      <monitor description="description3.2" /> 
     </monitors> 
     </monitor> 
    </monitors> 
    </monitorSettings> 
</configuration> 

和配置類,如:

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Linq; 
using System.Text; 

namespace RecursiveCustomConfiguration 
{ 

    public class MonitorConfig : ConfigurationSection 
    { 
     public static MonitorConfig GetConfig() 
     { 
      return ConfigurationManager.GetSection("monitorSettings") as MonitorConfig; 
     } 

     [ConfigurationProperty("monitors", IsDefaultCollection = true, IsRequired = true)] 
     [ConfigurationCollection(typeof(MonitorCollection), AddItemName = "monitor")] 
     public MonitorCollection Monitors 
     { 
      get 
      { 
       return this["monitors"] as MonitorCollection; 
      } 
     } 

    } 

    public class MonitorCollection : ConfigurationElementCollection 
    { 

     public Monitor this[int index] 
     { 
      get 
      { 
       return base.BaseGet(index) as Monitor; 
      } 
      set 
      { 
       if (base.BaseGet(index) != null) 
       { 
        base.BaseRemoveAt(index); 
       } 
       this.BaseAdd(index, value); 
      } 
     } 

     public Monitor this[object description] 
     { 
      get 
      { 
       return base.BaseGet(description) as Monitor; 
      } 
     } 

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

     protected override object GetElementKey(ConfigurationElement element) 
     { 
      return ((Monitor)element).Description; 
     } 

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

     protected override string ElementName 
     { 
      get { return "monitor"; } 
     } 

    } 

    public class Monitor : ConfigurationElement 
    { 

     [ConfigurationProperty("description", IsRequired = true)] 
     public string Description 
     { 
      get 
      { 
       return this["description"] as string; 
      } 
     } 

     [ConfigurationProperty("monitors", IsRequired = false)] 
     public MonitorCollection Monitors 
     { 
      get 
      { 
       return this["monitors"] as MonitorCollection; 
      } 
     } 

    } 

} 

然後用於Windows控制檯應用程序中,例如:

MonitorCollection monitors = MonitorConfig.GetConfig().Monitors; 

foreach (Monitor m in monitors) 
{ 
    Console.WriteLine(m.Description); 
    if (m.Monitors != null && m.Monitors.Count > 0) 
    { 
     foreach (Monitor m1 in m.Monitors) 
     { 
      Console.WriteLine(m1.Description); 
     } 
    } 
} 
+0

如果您將Monitors集合的名稱設置爲「」,您將從原始海報中得到確切的架構。 – fsimonazzi

+0

這應該被標記爲答案。愛在哪裏??? –