我有以下类:
public class DataItemWrapper
{
public Type DataType { get; set; }
public object Data { get; set; }
}
假设我有一个方法"SaveToDb",该方法通过以下转换将DataItemWrapper
对象保存到 Sqlite 数据库中:
-
Type DataType
另存为字符串 (DataType.AssemblyQualifiedName) -
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
重载的文档。