2009-12-01 60 views
9

根据这个问题的标题来判断,我想要做的事情可能不可能,所以我会描述我在做什么,你可以随时让我知道我在做什么,做错了什么是更好的方式来实现我的目标。C#类型在运行时使用反射铸造

我有一个XML文件,它描述了1)派生自基本类型的自定义对象,以及2)内部字段名称和关联值。这些派生对象可能具有基类不知道的附加字段。

我将对象的类型提取为字符串,并将所有对象数据放入字典中,其中键是字段名称,值是字段的值。我使用字符串名称和对象的默认构造函数实例化对象。我可以将所有对象的属性嗅探到PropertyInfo []。现在我需要获取所有字符串形式的值,并将它们转换为正确的数据类型,以便将它们加载到对象的属性中。 (当我输入这个内容时,听起来我正在采取某种保存状态并恢复它,但我只听说过这类事情。如果您想要按照这些方式提出建议,请记住我卡住从XML文件读取数据,我不能改变这一点。)

我可以将所有的字符串值转换为由类型对象给出的类型,并使用我制作的蛮力函数具有以下定义:

public object convertMe(string v, Type t) 

因为我不知道是什么类型我在函数扔,我不知道发生了什么回来,我无法明确地投出对象分配给上述属性的正确类型。我一直在尝试下面这种类型转换无济于事:

string objectType = /*read type string from XML*/; 

... // Wherein I instantiate an object "theObject" and get PropertyInfo[] from it. 
... // I also make sure that I'm trying to assign the correct data to 
... // the correct property. 

Type t = currentProperty.PropertyType; 
object o = convertMe(value, Type.GetType(qtype)); 
currentProperty.SetValue(theObject, (t)o, null); // Doesn't work 
currentProperty.SetValue(theObject, (t)Convert.ChangeType(o, t), null); // Doesn't work. Apparently (t) is bad syntax. 

最终,我的目标是创建对象的实例,并以这样的方式,数据类型AREN从XML文件中的数据加载没有硬编码。我在C#中这样做的原因是因为这曾经是一个Python程序,我已经被分配到C#.NET 2.0中。至少可以说这是一种学习体验。我创建这个“强力功能”的原因是因为我正在寻找解决这个投射问题的方法,但无论我尝试什么,我都无法使其工作。我可能会用纯粹的力量自己做这件事,但我认为必须有一个我错过的优雅解决方案。

任何帮助,非常感谢!

回答

14

你根本不需要任何演员。 PropertyInfo.SetValue需要object类型的参数,因此只需将o传递给它即可。

+0

好吧frell我死了。我会把这个代码盲化。虽然MSDN文档说它使用了一个对象,但每个显示其使用的示例都使用了正确的值类型,所以我从来没有建立过这种连接。非常感谢! – Sanjamal 2009-12-01 18:14:47

5

根本不需要演员。只有当你试图直接处理对象,而不是在使用反射时,Casting才有用。

当你去设置属性,你使用PropertyInfo.SetValue。这需要object作为值参数,因此不需要尝试将其强制转换为特定类型(只要对象已经是正确的类型)。

由于您已经完成了将对象置于正确类型(转换或装入Object)中的“convertMe”,所有设置 - 只需使用它即可。

+0

非常感谢你! – Sanjamal 2009-12-01 18:15:25