Как использовать пользовательские свойства ConfigurationElement в .NET для дочерних элементов? - PullRequest
7 голосов
/ 12 августа 2011

Как я могу получить и использовать набор атрибутов в родительском ConfigurationSection в дочернем элементе CustomSetting?Мне нужен этот атрибут, когда элемент CustomSetting возвращает свойство Value.

Я хочу отформатировать App.config так:

<CustomSettings someProperty="foo">
    <CustomSetting key="bar" value="fermeneba" />
    <CustomSetting key="laa" value="jubaduba" />
</CustomSettings>

У меня работает код, за исключением того, что я не могунайдите способ доступа к атрибуту someProperty из класса CustomSetting.Пока что я нашел единственный способ отформатировать конфигурацию, которая выглядит грязно:

<CustomSettings>
    <CustomSetting someProperty="foo" key="bar" value="fermeneba" />
    <CustomSetting someProperty="foo" key="laa" value="jubaduba" />
</CustomSettings>

1 Ответ

13 голосов
/ 14 августа 2011

Достичь этого сложнее, чем должно быть, поскольку API-интерфейс System.Configuration не позволяет переходить от ConfigurationElement к его родительскому элементу. Следовательно, если вы хотите получить доступ к некоторой информации о родительском элементе, вам необходимо создать эту связь вручную. Я собрал пример реализации, которая делает это для фрагмента конфигурации в вашем вопросе:

public class CustomSettingsSection : ConfigurationSection
{
    [ConfigurationProperty("someProperty", DefaultValue="")]
    public string SomeProperty
    {
        get { return (string)base["someProperty"]; }
        set { base["someProperty"] = value; }
    }

    [ConfigurationProperty("", IsDefaultCollection = true)]
    public CustomSettingElementCollection Elements
    {
        get 
        {
            var elements = base[""] as CustomSettingElementCollection;
            if (elements != null && elements.Section == null)
                elements.Section = this;
            return elements;
        }
    }
}

public class CustomSettingElementCollection : ConfigurationElementCollection
{

    internal CustomSettingsSection Section { get; set; }

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

    public CustomSettingElement this[string key]
    {
        get { return BaseGet(key) as CustomSettingElement; }
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new CustomSettingElement { Parent = this };
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return (element as CustomSettingElement).Key;
    }

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

public class CustomSettingElement : ConfigurationElement
{

    internal CustomSettingElementCollection Parent { get; set; }

    public string SomeProperty
    {
        get
        {
            if (Parent != null && Parent.Section != null)
                return Parent.Section.SomeProperty;
            return default(string);
        }
    }




    [ConfigurationProperty("key", IsKey = true, IsRequired = true)]
    public string Key
    {
        get { return (string)base["key"]; }
        set { base["key"] = value; }
    }

    [ConfigurationProperty("value", DefaultValue = "")]
    public string Value
    {
        get { return (string)base["value"]; }
        set { base["value"] = value; }
    }

}

Вы можете видеть, что CustomSettingElementCollection имеет свойство Section, которое устанавливается в методе получения Elements раздела. В свою очередь, CustomSettingElement имеет свойство Parent, которое устанавливается в методе CreateNewElement() коллекции.

Это позволяет затем пройти по дереву отношений и добавить свойство SomeProperty к элементу, даже если это свойство не соответствует фактическому ConfigurationProperty для этого элемента.

Надеюсь, это даст вам представление о том, как решить вашу проблему!

...