2012-01-24 5 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 Console:

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

Если вы установили имя коллекции мониторов на «", вы получите точную схему с оригинального плаката. – fsimonazzi

+0

Это должно быть отмечено как ответ. Где любовь??? –