我正在写一个通用的roulette selection algorithm。通常,property
是一种原始数字类型,可用于对每个元素的“分数”求和。
但是,由于实现是通用的,并且没有办法直接将属性的类型限制为数值基元,所以我没有明确的方法来求和并通过{{ 1}}。
在下面的代码中,您将注意到我试图将属性的值添加到property
和sum
中。这段代码会产生错误,因为rouletteSum
返回的对象在实质上不破坏实现的通用性的情况下无法转换为原始数字类型。
我可以采取什么方法来确保算法的通用性,同时仍然能够按比例比较并从提供的PropertyInfo.GetValue()
的值中进行选择?
一个考虑因素是将property
约束为P
,但是我想当在IConvertible
参数中提供基元时,这将导致某些丑陋的类型转换。
property
答案 0 :(得分:4)
我可以采用什么方法来确保算法的通用性,同时仍然能够按比例比较提供的属性的值并从中进行选择?
您不这样做,至少不容易。 C#从未提供过适用于通过算术抽象的泛型类型系统。
这些年来有很多建议。例如,您可以想象允许在接口中使用静态成员,然后您可以说where T : IAddable<T>
,其中IAddable<T>
是一个承诺在public static T operator +(T, T)
上有T
的接口。
您还可以显式传入实现您的总和的Func<T, T, T>
,依此类推。
但是您面临的问题本质上是您希望滥用泛型以形成实际上不是泛型的专业化知识。我们认为泛型类似于List<T>
之类的东西,您可以在其中真正地列出任何类型的列表。您的代码实际上是通用的吗?听起来很简单,只需说double
就可以使它起作用。