我正在尝试创建一个通用的XML到对象转换器。换句话说,以下是我的XML
<setting>
<name>testing</name>
<type>System.String</type>
<defaultObj>TTTT</defaultObj>
</setting>
类型字段保存其重新加载的对象的类型。这只是我所选择的对象结构。无论如何,我有转换问题
System.String
进入实际的类型变量。因此,例如,为了转换我有以下代码:
foreach (XNode node in document.Element(root).Nodes())
{
T variable = new T(); //where T : new()
foreach (FieldInfo field in fields)
{
field.SetValue(variable, Convert.ChangeType(((XElement)node).Element(field.Name).Value, field.FieldType));
}
retainedList.Add(variable);
}
以通用方式返回对象。该算法完美运行,直到遇到Type字段。我得到了:
Invalid cast from 'System.String' to 'System.Type'.
运行时错误。据我所知,直接将类型标识符(字符串)直接转换为类型存在问题。我不知道如何解决这个问题,至少在保持通用和清洁方面。有任何想法吗?如果问题有点模糊,我很抱歉,如果你不太明白我会尝试进一步澄清。非常感谢任何帮助!
答案 0 :(得分:8)
您需要将字符串System.String
转换为System.String
类型。
您可以使用Type.GetType(string typeName);
例如,下面的type
变量的Type
对象为System.String
。
var type = Type.GetType("System.String");
然后,您可以在Type
超载的情况下使用Convert.ChangeType
。
Convert.ChangeType(fieldValue, type);
答案 1 :(得分:4)
查看具有各种重载的Type.GetType,将指定为字符串的地图类型转换为Type
个实例。
答案 2 :(得分:-6)
在我看来需要说的是,在开始处理序列化器和反序列化器之前,你应该对C#中的编程更加熟悉。如上所述,使用Type.GetType方法可以解决这个特定的障碍,但是我会指向System.Xml.Serialization命名空间的方向,这样的事情已经解决并准备好以便于使用。