Могу ли я добавить текстовый индекс вместо атрибута в конфигурацию .NET?

В настоящее время у меня есть настраиваемая конфигурация .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"];
    }
  }

}

Что делать, чтобы сделать его текстовым?

Ответы

Ответ 1

Немного исследований показывает, что существующие классы конфигурации не поддерживают этот тип элемента без создания настраиваемого класса для его обработки. В этой статье 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; }
    }
}

Ответ 2

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

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

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