2017-05-04 43 views
4

我想在列表中創建一個採用不同類型的屬性。這是我的課:c# - 無法從列表<DateTime?>轉換爲列表<dynamic>

public class ChartData 
{ 
    public string id { get; set; } 
    public List<dynamic> data { get; set; } 

    public ChartData() 
    { 
    } 

    public ChartData(string id, List<DateTime?> data) 
    { 
     this.id = id; 
     this.data = data; 
    } 
} 

    public ChartData(string id, List<float?> data) 
    { 
     this.id = id; 
     this.data = data; 
    } 

    public ChartData(string id, List<int?> data) 
    { 
     this.id = id; 
     this.data = data; 
    } 

在代碼中,我使用data列表存儲DateTime?float?int?數據。我能做些什麼來將這些不同類型存儲在一個類屬性中?

我收到錯誤:

Argument 2: cannot convert from 'System.Collections.Generic.List<System.DateTime?>' to 'System.Collections.Generic.List<dynamic>' 
+1

如果你真的想這樣做,你應該採取'對象'而不是'動態'。但我會建議不要這樣做,因爲當你想要獲取值時,它是屁股疼痛,因爲你必須檢查你有哪些類型的值。 –

+0

我得到與'對象'相同的錯誤。我可以用什麼來代替'List '? –

+0

什麼類型的數據是'context.system_state'分別屬性'time_stamp'? –

回答

8

我會建議使用泛型,如果你知道之前類型實例

public class ChartData 
{ 
    public string id { get; set; } 
} 

public class ChartData<T> : ChartData 
{ 
    public List<T> data { get; set; } 

    public ChartData() 
    { 
    } 

    public ChartData(string id, List<T> data) 
    { 
     this.id = id; 
     this.data = data; 
    } 
} 

用法:

ChartData<int> intData = new ChartData<int>("ID1", new List<int>()); 
ChartData<DateTime> dateData = new ChartData<DateTime>("ID1", new List<DateTime>()); 
ChartData<float> floatData = new ChartData<float>("ID1", new List<float>()); 



List<ChartData> list = new List<ChartData>() { 
    intData, 
    dateData, 
    floatData 
}; 
+0

如何設置他想要存儲'ChartData '實例的列表?他需要一個基類或一個接口。 –

+0

是的,這個工程。我已經這樣做了,但我還想創建一個'List ',我不知道在那裏使用什麼類型,因爲我希望這個列表包含所有三個'ChartData'類型。 –

+0

如果您需要將所有圖表日期存儲在單個集合中,而不考慮「數據」的數據類型,那麼您需要一個沒有通用參數的基類ChartData。 @MightyBadaboom –

2

我想下面的變化應該工作: FROM

public List<dynamic> data { get; set; } 

TO

public dynamic data { get; set; } 
+0

如果你這樣做,你會失去'List '成員,所以你甚至不知道它是一個列表。 – Maarten

0

你可以使用LINQ到轉換列表項的類型:

public ChartData(string id, List<DateTime?> data) 
{ 
    this.id = id; 
    this.data = data.Cast<dynamic>().ToList(); 
} 

重要提示:在這種情況下,你所創建的列表的副本並且調用者列表實例中的更改將不會反映在ChartData的實例中(儘管這可能更好)。

0

如果它適合你的情況下,你可以使用covariant收集這樣的:

IReadOnlyList<dynamic> data; 
data = new List<string>(); 

但只有引用類型的作品。

如果你不關心它是什麼類型的,你可以使用列表數據。

爲了更方便地訪問你可以使用這樣的事情:

private IList data; 
public IEnumerable<dynamic> Data { get { return data.OfType<dynamic>(); } } 

希望它能幫助。

相關問題