2017-07-09 43 views
0

在我的家庭自動化系統上,要創建帶有文檔的插件,我必須使用帶有摘要的類。C#反序列化爲動態類

我的插件與我的xiaomi網關通信以獲取有關傳感器的信息。所以有不同類型的傳感器,如「sensor_ht」,「magnet」或「motion」。

對於每個傳感器,有共同的屬性和不同的數據部分。我在jon獲得每個傳感器的狀態。

例如:

{"cmd":"report","model":"magnet","sid":"","short_id":40805,"data":" 
{\"status\":\"close\"}"} 
{"cmd":"report","model":"sensor_ht","sid":"","short_id":40805,"data":" 
{\"voltage\":\"3000\",\"temperature\":\"2367\",\"humidity,\":\"5285\"}"} 

所以我創建許多類這樣的,每個傳感器是在一個文件中。

sensor_ht.cs:

public class sensor_ht 
{ 
    public string model { get; set; } = "sensor_ht"; 
    public string sid { get; set; } 
    public string battery_type { get; set; } = "CR2032"; 
    public int battery { get; set; } 
    public sensor_ht.Report report { get; set; } 
} 

public class Report 
{ 
    public int voltage { get; set; } 
    public string temperature { get; set; } 
    public string humidity { get; set; } 
} 

magnet.cs:

public class magnet 
{ 
    public string model { get; set; } = "sensor_ht"; 
    public string sid { get; set; } 
    public string battery_type { get; set; } = "CR2032"; 
    public int battery { get; set; } 
    public magnet.Report report { get; set; } 
} 

public class Report 
{ 
    public int voltage { get; set; } 
    public string status { get; set; } 
} 

這是我的報告類:

public class Report 
{ 

     public string cmd { get; set; } 
     public string model { get; set; } 
     public string sid { get; set; } 
     public int short_id { get; set; } 
     public string token { get; set; } 
     public string data { get; set; } 
} 

反序列化的報告後,我初始化實例:

dynamic d = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("XiaomiSmartHome.Equipement." + read.model); 

但創建數據部分,我反序列化報告裏的數據:

dynamic data2 = JsonConvert.DeserializeObject<dynamic>(read.data); 

我想這個數據是正確的報告類。我想:

d.report = data2; 

但最高審計機關,這是不可能的Newtonsoft.Json.Linq.JObject轉換爲XiaomiSmartHome.Equipement.Report

所以我的方式來處理,這是正確的?以及如何將數據部分反序列化爲正確的報告?

謝謝!

回答

2

好吧,我終於找到了答案,我用:

var messageType = Type.GetType(deserialized.MessageType); 
var message = JsonConvert.DeserializeObject(
Convert.ToString(deserialized.Message), messageType); 
+0

您可以接受你自己的答案。 –