2014-12-12 3 views
0

Я знаю, что то, что я пытаюсь сделать, возможно, потому что я это сделал - у меня просто нет доступа к коду, в котором я это сделал. Более того, я не могу найти Google подробности о том, как это сделать.Конфигурация пользователя со списком

У меня есть конфигурационный файл, содержащий что-то вроде следующего:

<resources> 
    <item title="A" details="aaaaaa" /> 
    <item title="b" details="bbbbbbb" /> 
    <item title="c" details="ccccc" /> 
    <item title="d" details="ddddd" /> 
</resources> 

как название и детали (потенциально) HTML.

Я хочу, чтобы загрузить их в свой код через обработчик определенного описания, которая (в основном)

public class ResourceGroup : ConfigurationSection, IConfigurationSectionHandler 
{ 
    private ResourceGroup() {} 
    public static List<ResourceDetail> getDetails() 
    { 
     var items = new List<ResourceDetail>(); 
     var entry= ConfigurationManager.GetSection("resources"); 
??? 
      items.Add(new ResourceDetail(node)); 
???    
     return items; 
    } 

Я знаю, что я могу просматривать записи в этой конфигурации раздела в формате XML, добавив resourceDetails созданные из XML-узлов. Однако я не могу найти, как это сделать.

В качестве альтернативы, как мне представить этот список записей в конфигурации с помощью определений свойств. Я бы предпочел не использовать подход «добавить», потому что у них нет ключа, естественно.

спасибо.

Edit - конфигурационный файл конфигурации раздела:

<configSections> 
    <section name="resources" type="BoredWithChurch.ConfigHandlers.ResourceGroup" /> 
    <section name="links" type="BoredWithChurch.ConfigHandlers.LinksHandler" /> 
</configSections> 
+0

Я добавил configSections часть. –

ответ

1

Насколько я вижу, нет никакого способа, чтобы ResourceGroup наследоваться от ConfigurationSection и ConfigurationElementCollection, что означает, что вам придется добавить дополнительный узел, который держит <item> «s вместе:

<resources> 
    <items> 
     <item title="A" details="aaaaaa" /> 
     <item title="b" details="bbbbbbb" /> 
     <item title="c" details="ccccc" /> 
     <item title="d" details="ddddd" /> 
    </items> 
</resources> 

Тогда ResourceGroup класс будет выглядеть следующим образом:

public class ResourceGroup : ConfigurationSection 
{ 
    [ConfigurationProperty("items", IsRequired=true)] 
    public ResourceItemCollection Items 
    { 
     get { return (ResourceItemCollection)this["items"]; } 
    } 
} 

ResourceItemCollection класс:

[ConfigurationCollection(typeof(ResourceItem), AddItemName = "item", CollectionType = ConfigurationElementCollectionType.BasicMap)] 
public class ResourceItemCollection : ConfigurationElementCollection 
{ 
    public ResourceItem this[int index] 
    { 
     get { return (ResourceItem)BaseGet(index); } 
    } 

    public new ResourceItem this[string name] 
    { 
     get { return (ResourceItem)BaseGet(name); } 
    } 

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

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((ResourceItem)element).Title; 
    } 
} 

И последнее, но не менее важное, ResourceItem класс:

public class ResourceItem : ConfigurationElement 
{ 
    [ConfigurationProperty("title", IsRequired = true)] 
    public string Title 
    { 
     get { return (string)this["title"]; } 
    } 
    [ConfigurationProperty("details", IsRequired = true)] 
    public string Details 
    { 
     get { return (string)this["details"]; } 
    } 
} 

Использование

static void Main(string[] args) 
{ 
    var section = ConfigurationManager.GetSection("resources") as ResourceGroup; 
    foreach (ResourceItem item in section.Items) 
    { 
     Console.WriteLine(item.Title); 
    } 
    Console.ReadKey(); 
} 
+0

Отлично - спасибо. Это становится все вокруг разных классов конфигурации и как использовать их, с которыми я всегда сталкиваюсь. Теперь у меня это в моем собственном коде, я могу использовать его в другом месте! –

Смежные вопросы