1

我希望能够在我的 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 但这在运行时失败了,因为该组似乎不能有多个同名部分。

4

1 回答 1

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。)

于 2014-03-22T04:51:12.130 回答