0

我有一个应用程序,我需要为特定业务实体(即国家/地区)进行配置设置。配置将如下所示:

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

我想要的是能够将其读入我所在站点的静态对象中。因此,对于美国站点,它将加载到具有 value="US" 的整个国家节点中。加载后,我希望能够像这样阅读它:

string var = Config.metaData.filePath

或者

string var = Config.sublayouts.template["division"].path;

这甚至可行吗?是否有一个好的设计模式(不太难)可以做到这一点?只要有意义,我完全愿意更改 XML 的结构。我希望能够在需要时添加新部分。基本上,这个想法是有一个灵活的配置系统,它不是太难以编程方式维护。

4

2 回答 2

1

您可以利用C# 4.0中的Dynamic和ExpandoObject。通过将 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;

更多信息:ExpandoObject 简介

于 2012-08-05T06:41:01.563 回答
0

您要做的是首先设计数据容器。换句话说,您最终会得到每个 XML 节点类型的类:Country 和 Template。你会得到这样的东西:

class Country {
  IList<KeyValuePair<string, string>> MetaData {get;set;}
  IList<Template> Sublayouts {get;set;}
}

一旦你得到了这些数据,你就有了几个将它序列化到 XML 和从 XML 序列化的选项:DataContractSerializer、BinaryFormatter、XmlSerializer 等。

于 2012-08-04T04:50:17.843 回答