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

Ser*_*rov 5 c# xml linq

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

<setting>
   <name>testing</name> 
   <type>System.String</type>
   <defaultObj>TTTT</defaultObj>
</setting>
Run Code Online (Sandbox Code Playgroud)

type字段保存其加载的对象的类型.这只是我所选择的对象结构.无论如何,我遇到了转换问题

System.String
Run Code Online (Sandbox Code Playgroud)

到一个实际的类型变量.所以,例如,为了转换我有以下代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

以通用方式获取对象.该算法完美运行,直到遇到Type字段.我得到一个:

Invalid cast from 'System.String' to 'System.Type'.
Run Code Online (Sandbox Code Playgroud)

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

ken*_*ken 8

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

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

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

var type = Type.GetType("System.String");
Run Code Online (Sandbox Code Playgroud)

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

Convert.ChangeType(fieldValue, type);
Run Code Online (Sandbox Code Playgroud)


Sea*_*ean 5

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