我有以下课程:
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" 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());
我该怎么做?
希望我足够清楚
答案 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。