使用反射在运行时C#类型转换

时间:2009-12-01 17:51:10

标签: c# dynamic casting

根据这个问题的标题来判断,我想要做的事情可能是不可能的,所以我会描述我在做什么,你可以随时让我知道我做错了什么以及什么会更好实现目标的方法。

我有一个XML文件,它描述了1)一个基本类型派生的自定义对象,以及2)内部字段名称和相关值。这些派生对象可能包含基类不了解的其他字段。

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

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

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.

最终,我的目标是创建一个对象实例,并使用XML文件中的数据加载它,使数据类型不是硬编码的。我在C#中这样做的原因是因为这曾经是一个Python程序,我已被分配将其转换为C#.NET 2.0。至少可以说,这是一种学习经历。我创建“暴力函数”的原因是因为我正在寻找解决这个投射问题的方法,但无论我尝试什么,我都无法让它发挥作用。我可以使用纯粹的力量自己做这件事,但我认为必须有一个我缺少的优雅解决方案。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:14)

你根本不需要任何演员阵容。 PropertyInfo.SetValue采用object类型的参数,因此只需将o传递给它,就可以了。

答案 1 :(得分:5)

根本不需要演员表。只有当您尝试直接处理对象时,才能使用强制转换,而不是在使用反射时。

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

由于你已经完成了一个“convertMe”,它将对象放入正确的类型(强制转换或装入Object),所以你已经完成了设置 - 只需使用它。