Проблема с пользовательскими настройками конфигурации - PullRequest
0 голосов
/ 26 ноября 2010

Я добавил пользовательский раздел в файл app.config для приложения Windows Forms. Я создал класс для расширения файла конфигурации:

CustomFields myCustomFields = (CustomFields)System.Configuration.ConfigurationManager.GetSection("CustomFields");

Я указываю название раздела:

<section name="CustomFields" type="Application.Core.CustomFields, ATMCardRequest.Core" allowLocation="true" allowDefinition="Everywhere" />

Теперь вот где, я думаю, проблема. Выше все работало хорошо, но мне нужно много свойств для этого раздела, и вместо этого:

<CustomFields setting1='hello' setting2='world'/>

Я делаю это:

<CustomFields>
<property name="setting1">hello</property>
<property name="setting2">world</property>
...
</CustomFields>

Код:

 /// <summary>
    /// Settings file which holds the name of the XML Fields 
    /// </summary>
    public class setting1: ConfigurationSection
    {

        /// <summary>
        /// Name of the setting1 Field 
        /// </summary>
        [ConfigurationProperty("setting1", IsRequired = true)]
        public String setting1
        {
            get
            {
                return (String)this["setting1"];
            }
            set
            {
                this["setting1"] = value;
            }
        }

        /// <summary>
        /// Name of the setting2 Field
        /// </summary>
        [ConfigurationProperty("setting2",IsRequired = true)]
        public String setting2
        {
            get
            {
                return (String)this["setting2"];
            }
            set
            {
                this["setting2"] = value;
            }
        }
}
}

Что не работает. Очевидно, он не понимает синтаксис свойства.

Есть идеи, что я делаю не так? Благодаря.

1 Ответ

1 голос
/ 26 ноября 2010

Если бы определить свойства, которые вам нужны таким образом:

<CustomFields>
    <property name="setting1">hello</property>
    <property name="setting2">world</property>
    ...
</CustomFields>

, тогда каждое «свойство» становится дочерним узлом для CustomFields, и ваши свойства теперь являются атрибутами / значениями для этих дочерних узлов, а не атрибутамиУзел CustomFields, как в первом примере.

Если у вас много свойств, и вы хотите установить их более элегантно, вот два варианта, которые можно рассмотреть:

1) Используйте следующую структуру для пользовательского раздела(слегка изменено):

<CustomFields>
    <setting1 value="hello"/>
    <setting2 value="world"/>
    ...   
</CustomFields>

и следующий код для определения свойств, используемых для получения значений:

public class CustomFields: ConfigurationSection
{            
    [ConfigurationProperty("setting1")]
    public PropertyElement Setting1
    {
        get
        {
            return (PropertyElement)this["setting1"];
        }
        set
            { this["setting1"] = value; }
    }

    [ConfigurationProperty("setting2")]
    public PropertyElement Setting2
    {
        get
        {
            return (PropertyElement)this["setting2"];
        }
        set
            { this["setting2"] = value; }
    }
}  
public class PropertyElement : ConfigurationElement
{
    [ConfigurationProperty("value", IsRequired = false)]
    public String Value
    {
        get
        {
            return (String)this["value"];
        }
        set
        {
            this["value"] = value;
        }
    }
}

Затем для получения значений:

string setting1value = myCustomFields.Setting1.Value;
string setting2value = myCustomFields.Setting2.Value;

Подробнее см. Как: создать пользовательские разделы конфигурации с помощью ConfigurationSection на MSDN.

2) Использовать программный подход, а не полагаться на атрибуты и отражение, ConfigurationSection class или IConfigurationSectionHandler может использоваться в этом случае.В результате у вас будет доступ из кода к узлу xml, содержащему данные пользовательского раздела, и вы сможете загружать любые XML-структуры.

...