在我开发的一个项目中,我使用了与我发现的类似的配置。我相信这篇文章被称为我需要的最后一个配置部分处理程序(我找不到工作链接,也许有人可以为我链接)。
此方法更进一步,将对象反序列化到内存中。我只是从我的项目中复制代码,但如果你想要的只是 XML,倒退一步应该相当简单。
首先,您需要定义一个处理您的配置设置的类。
using System;
using System.Configuration;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.XPath;
namespace Ariel.config
{
class XmlSerializerSectionHandler : IConfigurationSectionHandler
{
#region IConfigurationSectionHandler Members
public object Create(object parent, object configContext, XmlNode section)
{
XPathNavigator nav = section.CreateNavigator();
string typename = (string)nav.Evaluate("string(@type)");
Type t = Type.GetType(typename);
XmlSerializer ser = new XmlSerializer(t);
return ser.Deserialize(new XmlNodeReader(section));
}
#endregion
}
}
现在,假设您要加载配置部分...超级简单,转换为您期望 XML 序列化到的对象类型,然后传递您要查找的部分(在本例中为 @987654325 @。
try
{
config = (Eagle.Search.SearchSettings)ConfigurationSettings.GetConfig("SearchSettings");
}
catch (System.Configuration.ConfigurationException ex)
{
syslog.FatalException("Loading search configuration failed, you likely have an error", ex);
return;
}
现在,您只需要 App.config 文件。我选择将我的文件拆分为单独的文件(每个部分 1 个文件),只是为了使管理配置更容易一些。您定义一个部分,给它一个名称,然后定义类型(无论您如何称呼上面列出的类)和程序集的名称。
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="SearchSettings" type="Ariel.config.XmlSerializerSectionHandler, Ariel"/>
</configSections>
<SearchSettings configSource="Config\Search.config" />
</configuration>
现在,剩下的就是要反序列化的配置文件。这里重要的是该块与您的部分名称匹配,您的类型是它应该反序列化到的任何对象以及程序集名称。
<?xml version="1.0" encoding="utf-8" ?>
<SearchSettings type="Eagle.Search.SearchSettings, Eagle">
<NumThreads>4</NumThreads>
</SearchSettings>
如果您只想要纯原始 XML,您需要做的就是修改处理该部分的 Object 以返回 XML 或做任何您需要做的事情。