2012-08-04 224 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