加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在不知道其类型的情况下反序列化实体

发布时间:2020-12-15 21:01:34 所属栏目:百科 来源:网络整理
导读:我在我的项目中想出了这个问题,我有一个来自表的json字符串,它是一个序列化的实体. JSON {"Entity":{"__type":"Book:#Definition","BookId":3,"BookName":"Meloon Dreams","Type":2,"Price":35}} 书类 namespace Definition{ [DataContract] public class Bo
我在我的项目中想出了这个问题,我有一个来自表的json字符串,它是一个序列化的实体.
JSON

{
"Entity":{
"__type":"Book:#Definition","BookId":3,"BookName":"Meloon Dreams","Type":2,"Price":35
}
}

书类

namespace Definition
{
   [DataContract]
   public class Book : IEntity
   {
       [DataMember]
       public int BookId { get; set; }

       [DataMember]
       public string BookName { get; set; }

       [DataMember]
       public BookType Type { get; set; }

       [DataMember]
       public decimal Price { get; set; }
   }
}

工作流程类

public class Workflow
{
    public int WorkflowId { get; set; }

    public IEntity Entity { get; set; }
}

所以,在控制器类中,我从表中获取json字符串,我想将其反序列化为自己的类型.但是,只有json字符串中的__type帮助我了解它的类型.我的意思是

workflow.Entity = Serializer.JsonDeserialize<IEntity>(jsonString);

我需要把Book而不是IEntity

这是否可以在不改变类结构的情况下实现,或者是否可以从json获取类型并将其转换为类型并将其替换为IEntity?

解决方法

如果我正确理解了这个问题,你想要实例化动态指定泛型类型的泛型类.可以用反射来做到这一点:

// Load type name from json - you'll need to implement LoadTypeFromJson() method to load type name string from json
string typeName = LoadTypeFromJson();

// Get .Net Type by type name
Type entityType = Type.GetTypeByName(typeName);

// Get Serializer type
Type serializerType = typeof(Serializer);

// Get MethodInfo for Deserialize method of Serializer class
MethodInfo deserializeMethodInfo = serializerType.GetMethod("Deserialize");

// Construct Serializer.Deserialize<IEntity> method for specific IEntity
MethodInfo constructedDeserializeMethod = deserializeMethodInfo.MakeGenericMethod(entityType);

// Call constructed method
constructedDeserializeMethod.Invoke(null,new object[] { jsonString });

这里的关键部分是MethodInfo.MakeGenericMethod method

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读