簡體   English   中英

帶有列表的用戶配置部分

[英]User config section with a list

我知道我正在嘗試做的事情是可能的,因為我已經做到了-我再也無法訪問在其中執行過的代碼。而且,我找不到使用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中此配置部分中的條目,添加從XML節點創建的resourceDetails條目。 但是我找不到如何做。

另外,我如何使用屬性定義表示此配置中的條目列表。 我寧願避免使用“添加”方法,因為它們自然沒有密鑰。

謝謝。

編輯-配置文件配置部分:

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

據我所知,沒有辦法讓ResourceGroupConfigurationSectionConfigurationElementCollection繼承,這意味着您必須添加一個其他節點,以將<item>保持在一起:

<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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM