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

本文关键字:动态 类型转换 类型 | 更新日期: 2023-09-27 18:30:16

我有以下类:

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 并保存为字符串。

现在我需要编写一个方法GetFromDb它查询"DataItemWrappers"表并获取作为输入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());

我该怎么做?

希望我足够清楚

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

DeserializeObject方法有几个重载。其中之一是:

public static Object DeserializeObject(
    string value,
    Type type
)

所以你可以写:

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

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

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

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

下面是该DeserializeObject重载的文档。