Картинка блога

Этим постом я начну короткий цикл статей о конфигурационных файлах. Казалось бы, что может быть проще редактирования конфиг файлов, тем не менее есть несколько моментов, которые могут показаться сложными для начинающего или даже неизвестными для «продолжающего си шарпера». Нет, это статья не о мало известных секциях и даже не о том том как круто можно загружать чужие конфиги или сохранять их программно. Обо всем по порядку:

Пример собственной секции

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

1. Создем класс наследник от ConfigurationSection:

public class ConsoleConfigSection : ConfigurationSection
{
public static ConsoleConfigSection GetConfig()
{
return (ConsoleConfigSection)ConfigurationManager.
GetSection("console") ??
new ConsoleConfigSection();

}
[ConfigurationProperty("kvp")]
public NameValueConfigElementCollection Kvp
{
get
{
return (NameValueConfigElementCollection)this["kvp"] ??
new NameValueConfigElementCollection();
}
}
[ConfigurationProperty("prop", IsKey = true, IsRequired = true)]
public string Prop { get { return this["prop"] as string; } }
}

Для наглядности, тут 2 поля: kvp — коллекция, и name — обычное свойство.

2. Создаем класс коллекции. Наследник от ConfigurationElementCollection

Этот класс описывает коллекцию с дополнительным свойством disabled.

public class NameValueConfigElementCollection : ConfigurationElementCollection
{
public NameValueConfigElement this[int index]
{
get
{
return base.BaseGet(index) as NameValueConfigElement;
}
set
{
if (base.BaseGet(index) != null)
{
base.BaseRemoveAt(index);
}
this.BaseAdd(index, value);
}
}
protected override ConfigurationElement CreateNewElement()
{
return new NameValueConfigElement();
}

protected override object GetElementKey(ConfigurationElement element)
{
return ((NameValueConfigElement)element).Name;
}

[ConfigurationProperty("disabled", IsKey = true)]
public bool Disabled { get { return (bool)this["disabled"]; } }
}

3. Создаем класс описывающий свойства в коллекции. Наследник класса ConfigurationElement

Этот класс описывает свойства одного элемента в коллекции.В этом примере у него одно поле обязательно — name а одно — value — нет.

public class NameValueConfigElement : ConfigurationElement
{
[ConfigurationProperty("name", IsKey = true, IsRequired = true)]
public string Name { get { return this["name"] as string; } }

[ConfigurationProperty("value", IsRequired = false)]
public string Value { get { return this["value"] as string; } }
}

4. Тестируем

Для этого нужно добавить описание секции и саму секцию в конфигурационный файл

<configuration>
  <configSections>
    <section name="console" type="BinaryAnalysis.Terminal.ConsoleConfigSection, BinaryAnalysis.Terminal"/>
  </configSections>
  <console prop="myProp">
    <kvp disabled="true">
      <add name="myName" value="myValue" />
    </kvp>
  </console>
</configuration>

В итоге, читаем секцию из кода:

ConsoleConfigSection.GetConfig().Kvp
.Cast<NameValueConfigElement>()
.Select(x => x.Name).ToArray();

В следующей статье я расскажу как шифровать любую секцию.

Метки:,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>