2017-07-27 79 views
0

我正在尋找一種方法來創建一個接受多個類作爲值的字典。C#字典多個類作爲值

我從小米網關和各種設備中獲得價值,我已經爲每種設備上課了。

例如我的磁傳感器:

[XiaomiEquipement("magnet")] 
public class Magnet 
{ 
    public string Model { get; set; } = "magnet"; 
    public string Sid { get; set; } 
    public string Battery { get; set; } = "CR1632"; 
    public int BatteryLevel { get; set; } 
    public MagnetReport Report { get; set; } 
} 

[XiaomiEquipement("magnet_report")] 
public class MagnetReport 
{ 
    public int Voltage { get; set; } 
    public status { get; set; } 
} 

而且我wallplug:

[XiaomiEquipement("plug")] 
public class Plug 
{ 
    public string Model { get; set; } = "plug"; 
    public string Sid { get; set; } 
    public string Battery { get; set; } = "CR2450"; 
    public int BatteryLevel { get; set; } 
    public PlugReport Report { get; set; } 
} 

[XiaomiEquipement("plug_report")] 
public class PlugReport 
{ 
    public int Voltage { get; set; } 
    public string Status { get; set; }  
} 

小蜜網關發送兩個類型的數據,報告時,事情發生心跳每x分鐘。

{ 「CMD」: 「心跳」, 「模型」: 「插頭」, 「SID」: 「158d000123f0c9」, 「short_id」:11119 「數據」: 「{\」 電壓\「:3600 ,\ 「狀態\」:\ 「關\」,\ 「INUSE \」:\ 「0 \」,\ 「power_consumed \」:\ 「7 \」,\ 「load_power \」:\ 「0.00 \」}」 }

{「cmd」:「report」,「model」:「plug」,「sid」:「158d000123f0c9」,「short_id」:11119,「data」:「{\」status \「:\」 「}」}

正如你所看到的,這兩條線的數據並不相同。因此,我想在啓動插件類時,在心跳或報告到達時填寫缺失的數據。

我使用Activator.CreateInstance與傳感器類型來創建正確的類。

modelType = Assembly.GetExecutingAssembly().GetTypes().SingleOrDefault(t => t.GetCustomAttribute<Response.XiaomiEquipementAttribute>()?.Model == read.Model); 
modelReportType = Assembly.GetExecutingAssembly().GetTypes().SingleOrDefault(t => t.GetCustomAttribute<Response.XiaomiEquipementAttribute>()?.Model == read.Model + "_report"); 

我嘗試使用字典存儲,然後我的傳感器數據來編輯連接心跳後,而且是每一個傳感器具有不同的類這是行不通的。

我嘗試添加一個接口,它的工作,但它不適用於報告類。

如何將這些類包含到我的字典中並訪問它?

基本上我想通過鍵搜索字典,獲取價值並改變它的一部分。

+0

您是否嘗試過使用抽象類? – noone392

+0

還是一個界面? –

+2

此外,如果你想它是任何你可以只是使值類型的對象,然後當確定什麼類型時,只是調用object.type()並檢查 – noone392

回答

1

您可以使用Dictionary<string, object>來存儲它們。

var items = new Dictionary<string, object>(); 
var mag = new Magnet() { Sid = "1" }; 
var mot = new Motion() { Sid = "2" }; 
items.Add(mag.Sid, new Magnet()); 
items.Add(mot.Sid, new Motion()); 

然後你就可以使用確定像Object.GetType()這樣類型:

foreach (var thisItem in items) 
{ 
    // or use thisItem.Value is Magnet 
    if (thisItem.Value.GetType().Name == "Magnet") 
    { 
     Console.WriteLine("Magnet"); 
    } 
    else 
    { 
     Console.WriteLine("Motion"); 
    } 
} 

你也可以把公共屬性成一個基類,從基類繼承兩個類。

+0

基類的好名字是* Sensor *:o) –

+1

我會'如果(thisItem.Value是磁鐵磁鐵)' –

+0

@KrisVandermotten謝謝!這是一個很好的建議。其實它更好。 – CodingYoshi