Как получить элемент конфигурации - PullRequest
6 голосов
/ 20 мая 2009

Helo

Может кто-нибудь объяснить мне, как получить элемент конфигурации из файла .config. Я знаю, как обрабатывать атрибуты, но не элементы. В качестве примера хочу разобрать следующее:

<MySection enabled="true">

 <header><![CDATA[  <div> .... </div>  ]]></header>

 <title> .... </title>

</MySection>

Мой код на c # выглядит так:

 public class MyConfiguration : ConfigurationSection
    { 
        [ConfigurationProperty("enabled", DefaultValue = "true")]
        public bool Enabled
        {
            get { return this["enabled"].ToString().ToLower() == "true" ? true : false;   }
        }

        [ConfigurationProperty("header")]
        public string header
        {
                ???
        }
  }

Работает с атрибутами, как мне работать с элементами (свойство заголовка в приведенном выше коде)?

Ответы [ 8 ]

6 голосов
/ 22 января 2013

Существует другой подход к тому же.

Мы можем создать элемент путем переопределения метода DeserializeElement для получения строкового значения:

public class EmailTextElement : ConfigurationElement {

    public string Value { get; private set; }

    protected override void DeserializeElement(XmlReader reader, bool s) {
        Value = reader.ReadElementContentAs(typeof(string), null) as string;
    }

}
4 голосов
/ 20 мая 2009

Вот довольно неплохой инструмент конструктора разделов конфигурации, который вы можете использовать (и он бесплатный):

Конструктор разделов конфигурации

EDIT:

Я изучал MSDN, и кажется, что пользовательские разделы конфигурации не могут делать то, что вы хотите, т.е. получение значения конфигурации от элемента. Пользовательские элементы конфигурации могут содержать другие элементы конфигурации, но значения конфигурации всегда берутся из атрибутов.

Может быть, вы можете поместить свои html-фрагменты в другие файлы и ссылаться на них в конфиге, например, так.

<MySection enabled="true"> 
  <header filename="myheader.txt" />
  <title filename="mytitle.txt" />
</MySection>
3 голосов
/ 11 января 2010

Наследовать класс ConfigurationElement и переопределять его метод десериализации. Используйте новый класс для представления элементов с текстовым содержимым.

http://www.codeproject.com/KB/XML/ConfigurationTextElement.aspx

2 голосов
/ 13 октября 2015

Работая с вашим примером, вы собираетесь переопределить десериализацию «заголовка» в ConfigurationElement, чтобы получить значение CDATA.

<MySection enabled="true">

  <header name="foo"><![CDATA[  <div> .... </div>  ]]></header>

  <title> .... </title>

</MySection>

    public sealed class HeaderSection: ConfigurationElement {
      private string __Name, __CDATA;

      [ConfigurationProperty("name", IsRequired = true)]
      public string Name {
        get {
          return this.__Name;
        }
        set {
          this.__Name = value;
        }
      }

      [ConfigurationProperty("value", IsRequired = true)]
      public string Value {
        get {
          return this.__CDATA;
        }
        set {
          this.__CDATA = value;
        }
      }

      protected override void DeserializeElement(System.Xml.XmlReader reader, bool s) {
        this.Name = reader.GetAttribute("name").Trim();
        string cdata = reader.ReadElementContentAs(typeof(string), null) as string;
        this.Value = cdata.Trim();
      }
    }
0 голосов
/ 27 марта 2011

Согласно MSDN , в .NET 4 есть новое свойство CurrentConfiguration, которое дает вам ссылку на экземпляр Configuration верхнего уровня, который представляет иерархию конфигурации, которая текущий экземпляр ConfigurationElement принадлежит.

0 голосов
/ 22 мая 2009

Вы можете создать класс, который наследуется от System.Configuration.ConfigurationElement, который представляет элемент в разделе конфигурации.

В есть простой пример документации MSDN для ConfigurationElement .

0 голосов
/ 22 мая 2009

Я наконец нашел один способ сделать это.

Существует интерфейс IConfigurationSectionHandler, который позволяет делать то, что я хочу. Требуется тот, кто пишет метод

 public object Create(object parent, object configContext, XmlNode section)

После этого вы анализируете section самостоятельно, чтобы я мог без проблем получить XmlElement:

        header  = s["header"]  != null ? s["header"].InnerText   : String.Empty;
        title   = s["title"]   != null ? s["title"].InnerText    : String.Empty;

Недостатком является то, что интерфейс устарел, но MSDN заявляет, что он не будет удален из будущих версий платформ, поскольку он используется внутри.

0 голосов
/ 20 мая 2009

Вы можете использовать ConfigurationManager.GetSection ("SectionName") для получения раздела конфигурации в файлах конфигурации.

...