2016-08-12 55 views
4

我在我的項目中提出了這個問題,我有一個表中的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; } 
} 

所以,在控制器類我從TABL JSON字符串e,我想將其反序列化爲它自己的類型。但是,只有json字符串中的__type可以幫助我處理它的類型。我的意思是

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

我需要把,而不是IEntity

這有可能在不改變類的結構,或者是有可能從JSON獲取類型並將其轉換爲鍵入並把它,而不是IEntity?

回答

0

如果我正確地理解了這個問題,您想實例化動態指定泛型的泛型類。這是可能的反射來做到這一點:

// 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

+0

問題幫了一點,但是,在我的項目,我不使用一個通用類,它是一個通用的方法。我的意思是我的工作流實體屬性需要顯式類型而不是泛型類型。所以我需要將json實體轉換爲它自己的類型並將其傳遞給解串器。不過,我會繼續檢查這個反射。謝謝。 – ibubi

+0

我已經用代碼示例更新了答案,並且更改了一個更適合的鏈接(關於MakeGenericMethod方法) - 希望它有助於 – Kel

+0

我必須爲我的目的更改我的類結構。因爲我的實體要在json中轉換的類型保存在json中:)這是一個悖論,我需要用字符串方法解析json來獲取類型,所以我決定改變我的類結構。但我將這篇文章標記爲答案,因爲我以這種方式實現了我的目的,並涵蓋了這個話題。不管怎麼說,還是要謝謝你。 – ibubi

相關問題