Можно ли добавить текстовый узел вместо атрибута в разделе конфигурации .NET? - PullRequest
17 голосов
/ 22 февраля 2011

В настоящее время у меня есть пользовательский раздел конфигурации .NET, который выглядит следующим образом:

<customSection name="My section" />

Я хочу написать это как текстовый узел (я не уверен, что это правильный термин?), Например:

<customSection>
  <name>My Section</name>
</customSection>

Мой текущий класс customSection выглядит следующим образом:

public class CustomSection: ConfigurationSection {

  [ConfigurationProperty("name")]
  public String Name {
    get {
      return (String)this["name"];
    }
  }

}

Что я должен сделать, чтобы сделать его текстовым узлом?

Ответы [ 2 ]

16 голосов
/ 22 февраля 2011

Небольшое исследование показывает, что существующие классы конфигурации не поддерживают этот тип элемента без создания специального класса для его обработки. В этой статье CodeProject рассматривается создание нового класса ConfigurationTextElement, который является универсальным и может анализировать сериализованную строку в объект (включая строку, как показано в статье).

Класскод краткий:

using System.Collections.Generic;
using System.Configuration;
using System.Xml;

public class ConfigurationTextElement<T> : ConfigurationElement
{
    private T _value;
    protected override void DeserializeElement(XmlReader reader, 
                            bool serializeCollectionKey)
    {
        _value = (T)reader.ReadElementContentAs(typeof(T), null);
    }

    public T Value
    {
        get { return _value; }
    }
}
12 голосов
/ 17 июля 2012

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

<customsection>
      <name key="val">My Section</name>
</customSection>

Тогда вы можете переопределить DeserializeElement примерно так:

protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
{
    int count = reader.AttributeCount;
    //First get the attributes
    string attrName;
    for (int i = 0; i < count; i++)
    {
        reader.MoveToAttribute(i);
        attrName = reader.Name;
        this[attrName] = reader.Value;
    }
    //then get the text content
    reader.MoveToElement();
    text = reader.ReadElementContentAsString();
}

Надеюсь, это поможет.

...