7

我正在尝试创建一个通用的 XML 到对象转换器。换句话说,以下是我的 XML

<setting>
   <name>testing</name> 
   <type>System.String</type>
   <defaultObj>TTTT</defaultObj>
</setting>

type 字段保存其加载回的对象的类型。这只是我在其中进行序列化的对象结构。无论如何,我在转换时遇到问题

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'.

运行时错误。据我所知,直接将类型标识符(字符串)直接转换为类型存在问题。我不确定如何解决这个问题,至少在保持通用和清洁方面是这样。有任何想法吗?如果问题有点模糊,我很抱歉,如果您不太了解,我会尝试进一步澄清。任何帮助是极大的赞赏!

4

3 回答 3

10

您需要将字符串System.String转换为类型System.String

你可以这样做Type.GetType(string typeName);

例如,type下面的变量将Type具有System.String.

var type = Type.GetType("System.String");

然后,您可以在您正在使用TypeConvert.ChangeType重载中使用它。

Convert.ChangeType(fieldValue, type);
于 2012-10-29T16:46:20.330 回答
5

看一下Type.GetType,它有多种重载,可以将指定为字符串的类型映射到Type实例。

于 2012-10-29T16:46:32.543 回答
-7

在我看来,这里需要说的是,在开始处理序列化器和反序列化器之前,您应该对 C# 编程更加熟悉。正如上面所建议的,这个特殊的障碍可以使用 Type.GetType 方法来解决,但是我会指出System.Xml.Serialization命名空间的方向,这样的事情已经解决并准备好使用。

于 2012-10-29T16:55:01.577 回答