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

9
根据这个问题的标题,我想做的可能不可能,所以我会描述一下我的做法,你可以随意告诉我我做错了什么,以及更好的实现目标的方法。
我有一个XML文件,描述了1)一个自定义对象,它是从基础类型派生出来的,以及2)内部字段名称和关联值。这些派生对象可能有额外的字段,基类不知道。
我将对象类型提取为字符串,并将所有对象数据放入字典中,其中键是字段名,值是字段的值。我使用字符串名称和对象的默认构造函数实例化对象。我可以将所有对象的属性嗅探到< strong> PropertyInfo [] 中。现在我需要将所有以字符串形式存在的值转换为正确的数据类型,以便我可以将它们加载到对象的属性中。(当我打字时,这听起来像是我正在保存状态并恢复它,但我只听说过这种事情。如果您想沿着这些线路提供建议,请记住我被困在从XML文件读取数据的位置上,我不能改变它。)
我可以将所有字符串值转换为由< strong> 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个回答

14

在那里完全不需要任何类型转换。 PropertyInfo.SetValue 接受一个类型为 object 的参数,所以只需将 o 传递给它即可。


好家伙,我得承认这是代码盲症。虽然MSDN文档说它需要一个对象,但每个使用示例都使用了正确的值类型,所以我从来没有想到过这一点。非常感谢! - Sanjamal

5
你根本不需要强制转换。只有在直接处理对象时才有用,而不是使用反射时。
当你要设置属性时,你正在使用PropertyInfo.SetValue。这需要一个object作为值参数,因此无需尝试将其强制转换为特定类型(只要对象已经是正确的类型)。
由于你已经执行了一个"convertMe",将对象放入了正确的类型(强制转换或装箱为Object),所以你可以直接使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接