2012-08-04 179 views
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> 

我要的是能够读入,因为我在现场静态对象这种所以,对于美国网站,它会在整个国家的加载值=“US”的节点。一旦加载,我希望能够阅读它喜欢:

string var = Config.metaData.filePath

OR

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

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

回答

1

你可以利用C#4.0中的DynamicExpandoObject。数据可以从XML加载到ExpandoObject动态铸造ExpandoObject到IDictionary的,是这样的:

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; 

的更多信息:Introducing the ExpandoObject

+0

不错!有没有办法动态地设置属性的名称?类似于:Country.Metadata =“blah” - 但名称“元数据”是动态的? – 2012-08-05 16:30:19

+0

如果您想要动态,请将Country声明为动态:dynamic country = new ExpandoObject(); country.MetaData = metaData; – 2012-08-05 16:38:22

+0

字符串元数据将来自字符串其他地方...你知道什么是国家的语法。“metadata”=“asdasd”其中“元数据”是一个变量? – 2012-08-05 16:40:00

0

你想要做的是先设计你的数据容器。换句话说,您将最终为每个XML节点类型生成一个类:Country和Template。你会得到这样的事情:

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

一旦你得到了你有几种选择它序列化和XML数据:DataContractSerializer的,BinaryFormatter的,XmlSerializer的,等

+0

你能在一个小更详细的解释一下吗?有没有办法让他们没有具体的课程?我希望能够在不添加其他类的情况下添加“sublayouts”等部分。 – 2012-08-04 15:36:35