使用Type类进行动态类型转换

时间:2014-11-12 13:40:42

标签: c# types casting json.net

我有以下课程:

public class DataItemWrapper
{
    public Type DataType { get; set; }
    public object Data { get; set; }
}

假设我有一种方法' SaveToDb'通过以下转换将DataItemWrapper对象保存到Sqlite数据库中:

  1. Type DataType保存为字符串(DataType.AssemblyQualifiedName)
  2. object Data被序列化为json并保存为字符串。
  3. 现在我需要编写一个方法GetFromDb来查询" DataItemWrappers" table和get作为输入Type DataType和一个json格式的字符串,表示我之前保存的对象。

    GetFromDb方法内部,我需要将dataJson反序列化为DataType类型。

    我不想将它反序列化为对象类型,而是更具体的类型。 例如,如果我发送保存下一个对象:new DataItemWrapper{DataType = typeof(Cat), Data = new Cat()}; 我想将DataItemWrapper.Data json反序列化为Cat类型而不是Object类型。

    这是json反序列化语法:

    JsonConvert.DeserializeObject<some type here>(rdr["Data"].ToString());
    

    我需要做类似的事情:

    JsonConvert.DeserializeObject<cast to Cat type using DataType parameter>(rdr["Data"].ToString());
    

    我该怎么做?

    希望我足够清楚

2 个答案:

答案 0 :(得分:1)

DeserializeObject方法有多个overloads。其中之一是:

public static Object DeserializeObject(
    string value,
    Type type
)

所以你可以写:

JsonConvert.DeserializeObject(
    rdr["Data"].ToString(),
    Type.GetType(rdr["DataType"].ToString())
);

您使用不同的方法来检索类型,例如yourAssembly.GetType,我不知道哪种方法最适合您的情况。

答案 1 :(得分:0)

由于您可以使用此类型,因此您可以执行以下操作:

var mytype = GetTypeFromName(rdr["Type"]);
JsonConvert.DeserializeObject(rdr["Data"].ToString(), mytype);

以下是DeserializeObject重载的documentation