我正在尝试在列表中创建一个属性不同的属性。这是我的班级:
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>'
答案 0 :(得分:8)
如果您知道实例化之前的类型,我建议使用Generics
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
};
答案 1 :(得分:2)
我认为以下更改应该有效: 的 FROM 强>
public List<dynamic> data { get; set; }
以强>
public dynamic data { get; set; }
答案 2 :(得分:1)
如果它适合您的情况,您可以使用covariant这样的集合:
IReadOnlyList<dynamic> data;
data = new List<string>();
但它仅适用于引用类型。
如果您不关心它是什么类型,您可以使用List作为数据。
为了更方便的访问,您可以使用以下内容:
private IList data;
public IEnumerable<dynamic> Data { get { return data.OfType<dynamic>(); } }
希望它有所帮助。
答案 3 :(得分:0)
您可以使用LINQ转换列表项的类型:
public ChartData(string id, List<DateTime?> data)
{
this.id = id;
this.data = data.Cast<dynamic>().ToList();
}
重要提示:在这种情况下,您正在创建列表的副本,并且调用者列表实例中的更改不会反映在ChartData
的实例中(尽管可能更好,但。)