无法从列表<日期时间?>转换为列表<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>'

,如果您知道实例化之前的类型

,我建议使用仿制药
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
};

我认为下面的更改应该有效:来自

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

to

 public dynamic data { get; set; }

如果适合您的案例,则可以使用这样的协变量集合:

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

,但它仅适用于参考类型。

如果您不在乎哪种类型,则可以使用数据列表。

要获得更方便的访问,您可以使用类似的东西:

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

希望它有帮助。

您可以使用linq转换列表项目的类型:

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

重要说明:在这种情况下,您正在创建列表的副本,并且列表的列表实例中的更改不会反映在ChartData的实例中(这可能更好。(

最新更新