2017-05-04 45 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>(); } } 

希望它能帮助。

相关问题