如何在.config文件中包含一组配置节

时间:2014-03-21 22:53:17

标签: c# web-config configurationsection

我希望能够在app / web.config文件中使用以下设置:

<listeners>
    <listener type="a">
         <parameter name="a", value="2" />
         <parameter name="b", value="20" />
    </listener>
    <listener type="b">
         <parameter name="a", value="2" />
         <parameter name="b", value="20" />
         <parameter name="c", value="200" />
    </listener>
    ...
</listeners>

基本上,我想表示一组侦听器,其中每个侦听器都有几个属性以及一组参数。我已设法将侦听器元素建模为ConfigurationSection,其参数为ConfigurationElements。但是,我找不到如何创建外部侦听器集合的示例。我需要做些什么才能对此进行建模?

我尝试将侦听器设置为ConfigurationSectionGroup,但这在运行时失败,因为看起来该组不能有多个同名的部分。

1 个答案:

答案 0 :(得分:1)

它可能是一个警察,因为它不使用任何自定义处理程序,但您可以将任意XML部分与XmlSerializer结合使用。

  <section name="listeners" type="System.Configuration.DefaultSection" />
  ...

<listeners>
  <listener type="a">
    <parameter name="a" value="2" />
    <parameter name="b" value="20" />
  </listener>
  <listener type="a">
    <parameter name="a" value="2" />
    <parameter name="b" value="20" />
    <parameter name="c" value="200" />
  </listener>
</listeners>

要获取侦听器数组,请获取原始XML并在需要对象时对其进行反序列化。

可序列化的类:

public class Parameter
{
    [XmlAttribute("name")]
    public String Name { get; set; }
    [XmlAttribute("value")]
    public Int32 Value { get; set; }
}

[XmlType(TypeName = "listener")]
public class Listener
{
    [XmlAttribute("type")]
    public String Type { get; set; }

    [XmlElement("parameter")]
    public Parameter[] Parameters;
}

而且,操作本身:

var serializer = new XmlSerializer(typeof(Listener[]), 
                                   new XmlRootAttribute("listeners"));
var configuration = ConfigurationManager
    .OpenExeConfiguration(ConfigurationUserLevel.None);
var section = configuration.GetSection("listeners");
var rawXml = section.SectionInformation.GetRawXml();
using (var stringReader = new StringReader(rawXml))
{
    var listeners = (Listener[])serializer.Deserialize(stringReader);
}

(或者,您可以使用XDocument来解析XML并查看单个元素或属性,而不是XmlSerializer。)