将字符串 (System.String) 转换为数据类型。

8
我将尝试创建一个通用的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'.

运行时错误。据我所知,它直接将类型标识符(字符串)转换为类型时出现了问题。至少在保持通用性和清晰性方面,我不确定如何解决这个问题。有什么想法吗?如果您不太理解,我会尽力进一步说明。非常感谢您的帮助!
3个回答

13

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

您可以使用 Type.GetType(string typeName); 来实现。

例如,下面的 type 变量将具有 System.StringType 对象。

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

然后,您可以在使用的Convert.ChangeType重载中使用该Type

Convert.ChangeType(fieldValue, type);

5

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


-8
在我看来,需要说的是,在开始处理序列化器和反序列化器之前,您应该对C#编程更加熟悉。如上所建议,可以使用Type.GetType方法解决这个特定的障碍,但我会指向System.Xml.Serialization命名空间,其中已经解决了这类问题并准备好供轻松使用。

3
我已经接触C#有一段时间了。在这种情况下,我有很多空闲时间。建议;如果你想真正学好某件事,就用自己的方式去做。最坏的情况是你会浪费时间,但相比走捷径,你会学到更多。 - Serguei Fedorov
你手头有很多时间吗?那太幸运了 :) - Tar

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