【发布时间】:2021-10-18 18:49:09
【问题描述】:
我有这个构造函数,它应该接受任何类型的任何 IEnumerable,并尝试将值转换为所需的类型
public ChartData(IEnumerable<dynamic> labels, IEnumerable<dynamic> values)
{
this.values = values.Select(x=>(float)Convert.ToString(x));
this.labels = labels.Select(x=>(string)Convert.ToString(x));
}
当我调用这个构造函数时,我可以传递字符串类型的 ienumerables,但不能传递 int 或 float 如何创建一个可以接受任何类型的 ienumerables 而不会产生大量重载的构造函数?
【问题讨论】:
-
存在用于编译时类型检查的类型。动态的——甚至对象——关闭编译时类型检查。 | Co-和Conravairance是一种选择。但通常您会将 ChartData 设为通用,因此您可以决定放入 IEnumerable 的类型。
-
查找通用方法以了解如何以正确的方式执行此操作:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
-
如果您接受任何类型,也包括
IEnumerable<User>和 ``IEnumerable`,您希望如何将它们转换为浮点数和字符串?最好有一个封装浮点数和字符串值的对象,为此使用接口。 -
这里要记住的一点是,由于本地化/文化方面的考虑,将值与字符串相互转换非常缓慢且容易出错。这是要避免的。因此,如果我们有一个
IEnumerable<double>,并且需要将其转换为IEnumerable<float>,则将每个双精度数转换为一个字符串,然后将这些字符串中的每一个转换回一个浮点数可能是处理这个问题的最慢和最不可靠的方法.