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