C#中的递归自定义配置 [英] Recursive Custom Configuration in c#
本文介绍了C#中的递归自定义配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试创建一个遵循以下递归结构的自定义配置部分:
I am trying to create a custom configuration section that follows the following recursive structure:
<monitorSettings>
<monitor description="description1" />
<monitor description="description2" />
<monitor description="description3">
<monitor description="description3.1" />
<monitor description="description3.2" />
</monitor>
</monitorSettings>
这可能吗?我不确定如何布置配置类.
Is this possible? I am not sure how I would lay out the configuration classes.
我的监视器有以下内容:
I have the following for the monitor:
public class Monitor : ConfigurationElement
{
[ConfigurationProperty("description", IsRequired = true)]
public String Description
{
get
{
return (String)this["description"];
}
set
{
this["description"] = value;
}
}
}
我需要添加什么使其递归?
What would I need to add to make it recursive?
推荐答案
您可以使用以下配置文件来完成此操作(对上面的配置稍作更改):
You can do this with a config file like the following (slight change to the one above):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="monitorSettings" type="RecursiveCustomConfiguration.MonitorConfig, RecursiveCustomConfiguration"/>
</configSections>
<monitorSettings>
<monitors>
<monitor description="description1" />
<monitor description="description2" />
<monitor description="description3">
<monitors>
<monitor description="description3.1" />
<monitor description="description3.2" />
</monitors>
</monitor>
</monitors>
</monitorSettings>
</configuration>
和类似的配置类:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
namespace RecursiveCustomConfiguration
{
public class MonitorConfig : ConfigurationSection
{
public static MonitorConfig GetConfig()
{
return ConfigurationManager.GetSection("monitorSettings") as MonitorConfig;
}
[ConfigurationProperty("monitors", IsDefaultCollection = true, IsRequired = true)]
[ConfigurationCollection(typeof(MonitorCollection), AddItemName = "monitor")]
public MonitorCollection Monitors
{
get
{
return this["monitors"] as MonitorCollection;
}
}
}
public class MonitorCollection : ConfigurationElementCollection
{
public Monitor this[int index]
{
get
{
return base.BaseGet(index) as Monitor;
}
set
{
if (base.BaseGet(index) != null)
{
base.BaseRemoveAt(index);
}
this.BaseAdd(index, value);
}
}
public Monitor this[object description]
{
get
{
return base.BaseGet(description) as Monitor;
}
}
protected override ConfigurationElement CreateNewElement()
{
return new Monitor();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((Monitor)element).Description;
}
public override ConfigurationElementCollectionType CollectionType
{
get { return ConfigurationElementCollectionType.BasicMap; }
}
protected override string ElementName
{
get { return "monitor"; }
}
}
public class Monitor : ConfigurationElement
{
[ConfigurationProperty("description", IsRequired = true)]
public string Description
{
get
{
return this["description"] as string;
}
}
[ConfigurationProperty("monitors", IsRequired = false)]
public MonitorCollection Monitors
{
get
{
return this["monitors"] as MonitorCollection;
}
}
}
}
然后在Windows控制台应用中使用例如:
Then to use in a Windows Console app for instance:
MonitorCollection monitors = MonitorConfig.GetConfig().Monitors;
foreach (Monitor m in monitors)
{
Console.WriteLine(m.Description);
if (m.Monitors != null && m.Monitors.Count > 0)
{
foreach (Monitor m1 in m.Monitors)
{
Console.WriteLine(m1.Description);
}
}
}
这篇关于C#中的递归自定义配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文