一般在C中创建对象#

问题描述:

我想要做的是从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

你想用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

如果你实例化对象的图形,将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