我有一个应用程序,我需要为特定的业务实体(即国家/地区)配置设置。配置将是这样的:
<country value="US">
<metadata>
<key name="filePath" value="c:\blah">
<key name="wsPath" value="http://blah.com">
</metadata>
<sublayouts>
<template value="division">
<key name="path" value="c:\blah\file.txt">
</division>
</sublayouts>
</country>
<country value="FR">
<metadata>
<key name="filePath" value="c:\blah">
<key name="wsPath" value="http://blah.com">
</metadata>
<sublayouts>
<template value="division">
<key name="path" value="c:\blah\file.txt">
</division>
</sublayouts>
</country>
我想要的是能够将其读入我所在站点的静态对象。因此,对于美国站点,它将加载到值为“US”的整个国家/地区节点。加载后,我希望能够像:
一样阅读
string var = Config.metaData.filePath
OR
string var = Config.sublayouts.template["division"].path;
这甚至可行吗?有这么好的设计模式(不是太难)吗?只要有意义,我完全愿意改变XML的结构。我希望能够在我想要的时候添加新的部分。基本上,我们的想法是拥有一个灵活的配置系统,这个系统不难以编程方式进行维护。
答案 0 :(得分:1)
您可以使用 ExpandoObject 在C#4.0中利用动态。通过将ExpandoObject强制转换为IDictionary,可以将数据从Xml动态加载到ExpandoObject中,类似于:
dynamic country = new ExpandoObject();
var countryDic = country as IDictionary<string, object>;
dynamic metadata = new ExpandoObject();
var metadataDic = metadata as IDictionary<string, object>;
metadataDic["filePath"] = "your file path";
countryDic["metadata"] = metadata;
var filePath = country.metadata.filePath;
答案 1 :(得分:0)
您要做的是首先设计数据容器。换句话说,您将最终得到每个XML节点类型的类:Country和Template。你会得到这样的东西:
class Country {
IList<KeyValuePair<string, string>> MetaData {get;set;}
IList<Template> Sublayouts {get;set;}
}
一旦获得了这些数据,您就可以通过以下几种方式将其序列化为XML:DataContractSerializer,BinaryFormatter,XmlSerializer等。