2010-04-19 51 views
6

我想要做的是從XML保存文件加載對象。問題是這些對象可以在運行時由用戶配置,這意味着我必須使用反射來獲取存儲在XML文件中的這些對象的名稱和屬性。一般在C中創建對象#

我是通過XML和最多的地方,我需要創建一個對象,然後將部分遞歸循環的中間以爲.....啊 - 不知道該怎麼做:(

我與空物體(m_MenuDataTypes)塞入一個數組,每個可能的類型之一。我的遞歸加載功能看起來像這樣

private void LoadMenuData(XmlNode menuDataNode) 
{ 
    foreach (object menuDataObject in m_MenuDataTypes) 
    { 
     Type menuDataObjectType = menuDataObject.GetType(); 
     if (menuDataObjectType.Name == menuDataNode.Name) 
     { 
      //create object 
     } 
    } 
} 

我需要把一些代碼在我的評論是,但我不能有大的開關語句或任何東西,我的數組中的對象可以根據用戶配置應用程序的方式進行更改

+0

我們可以看到該XML的一個片段嗎? – devnull 2010-04-19 14:42:15

+0

我回復@devnull - 我們可以看到XML嗎? – 2010-04-19 15:06:38

+0

我真的不能發佈它,因爲它完全界外的應用程序是什麼,這是公司代碼 - 對不起你們 試想一下,你平時的嵌套結構像 魚缸 魚 鮎魚性取向=「好同志」/ 角鯊special_abilities = 「玩長笛」/ /魚 /fishtank 那種事 – DrLazer 2010-04-19 15:18:08

回答

13

你想用Activator.CreateInstance(Type)

object instance = Activator.CreateInstance(menuDataObjectType); 

這種高效地工作,您可能需要限制動態創建的實例來實現一個接口

ICommonInterface i = (ICommonInterface)Activator.CreateInstance(menuDataObjectType) 

這樣,動態創建的對象變爲可用 - 你可以調用它的接口方法。

+1

如果激活器返回一個「對象」類型,它是否可以解析爲它的實際類型?例如,如果我只是把它塞進一個ArrayList,我可以做類似if(object [4]是TurboButton)嗎? – DrLazer 2010-04-19 14:49:15

+1

返回的對象是您傳遞給CreateInstance的類型的一個實例。你可以將它轉換回你的類型。 (或使用is運算符等)。有幾個CreateInstance的重載,您應該看看 - 包括一個接受字符串類型名稱和字符串程序集名稱的重載。 – JMarsch 2010-04-19 14:56:53

+0

不錯的人會做 – DrLazer 2010-04-19 15:20:22

2

如果你實例化對象的圖形,將XmlSerializer的或DataContractSerializer的更合適?

+0

是的它是一個很好的主意 - 我有一個要求,它很容易人類可讀,但:'( – DrLazer 2010-04-19 15:11:56

+0

沒有理由,如果你指定足夠的細節,它不應該是整潔和整潔在你的類的屬性 – 2010-04-19 15:18:59

+0

加上已經有負載的應用程序中的其他功能,處理由其他窺視正在處理的XML文件 - 你知道裂縫。如果它是由我決定,我們將它保存爲加密切口 – DrLazer 2010-04-19 15:22:02