c# - 无法将List<DateTime?>转换为List<dynamic>

4

我试图在一个列表中创建一个可以接受不同类型的属性。这是我的类:

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
如果你真的想这样做,你应该使用 object 而不是 dynamic。但是我建议不要这样做,因为当你想获取值时,这会非常麻烦,因为你必须检查你拥有的值的类型。 - Mighty Badaboom
我使用“object”时遇到了相同的错误。在List<T>之外,我可以使用什么? - A. Savva
context.system_statetime_stamp属性分别是什么类型的数据? - Mighty Badaboom
我认为问题在于您的T参数是可空的。 - Matt Evans
@MatthewEvans 我尝试了将它们设为非空,但仍然遇到相同的错误。 - A. Savva
把所有东西放在一个列表中的优点是什么?为什么不在类内保留单独的列表?您打算如何使用组合列表? - user4864425
4个回答

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
};

他该如何设置列表以存储 ChartData<T> 实例?他需要一个基类或接口。 - Mighty Badaboom
是的,这可以行得通。我已经做到了,但我还想创建一个 List<ChartData>,但我不知道在那里使用什么类型,因为我希望这个列表包含所有三种 ChartData 类型。 - A. Savva
如果您需要将所有图表数据存储在单个集合中,而不考虑“data”的数据类型,则需要一个没有泛型参数的基类ChartData。 @MightyBadaboom - Oday Fraiwan
谢谢!这就是我在寻找的东西。 - A. Savva

3
我认为以下更改应该可以起作用:
 public List<dynamic> data { get; set; }

TO

 public dynamic data { get; set; }

如果你这样做,你会失去List<T>的成员,所以你甚至不知道它是一个列表。 - Maarten

2
如果适用于您的情况,您可以像这样使用协变集合:covariant collection。请注意保留HTML标签。
IReadOnlyList<dynamic> data;
data = new List<string>();

但它只适用于引用类型。

如果你不关心它是什么类型,可以使用List来处理数据。

为了更方便地访问,你可以使用类似以下的语句:

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

希望这有所帮助。

0

您可以使用LINQ来转换列表项的类型:

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

重要提示:在这种情况下,您正在创建列表的副本,调用方实例中的更改不会反映在ChartData的实例中(尽管这可能更好)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接