微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我在我的项目中想出了这个问题,我有一个来自表的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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐