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

使用反射在运行时进行C#类型转换,c#,dynamic,casting,C#,Dynamic,Casting,从这个问题的标题来看,我想做的事情可能是不可能的,所以我将描述我正在做的事情,你可以随时让我知道我做错了什么,什么是实现我目标的更好方式 我有一个XML文件,它描述了1)从基类型派生的自定义对象,以及2)内部字段名和关联值。这些派生对象可能有基类不知道的其他字段 我将对象类型提取为字符串,并将所有对象数据放入字典中,其中键是字段名,值是字段值。我使用字符串名和对象的默认构造函数实例化对象。我可以将对象的所有属性嗅探到PropertyInfo[]中。现在,我需要获取字符串形式的所有值,并将它们转换

从这个问题的标题来看,我想做的事情可能是不可能的,所以我将描述我正在做的事情,你可以随时让我知道我做错了什么,什么是实现我目标的更好方式

我有一个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.NET2.0。至少可以说,这是一次学习经历。我之所以创建“蛮力函数”,是因为我一直在寻找解决这个铸造问题的方法,但无论我怎么尝试,我都无法让它工作。我可能会用纯力自己来做这件事,但我想一定有一个优雅的解决方案,我没有


非常感谢您的帮助

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

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

当您设置属性时,您正在使用。这将
对象
作为值参数,因此无需尝试将其强制为特定类型(只要对象已经是正确的类型)


既然您已经完成了将对象转换为正确类型的“convertMe”(强制转换或装箱到
对象中)
,那么您就已经准备好了—只需使用它。

好吧,让我死定了。我要把这归咎于代码盲症。尽管MSDN文档说它使用了一个对象,但每个显示其用法的示例都使用了正确的值类型,所以我从未进行过这种连接。非常感谢!