c#类型参数约束
本文关键字:参数约束 类型 | 更新日期: 2023-09-27 17:49:26
我正试图以某种方式做某事…但我肯定有更好的办法
public interface IMix
{
T Mix<T>(List<T> values) where T : IMix;
}
这样做的问题是,如果我想"混合"5个值,那么我需要做value1.Mix(others)
,但这并不干净。另外,T的类型需要与实现接口的任何类的类型相同。所以,这并不能真正起作用。
我在想这样的事情:
public static class MixWrapper
{
public static T Mix<T>(List<T> values);
}
但这显然不行因为我必须在MixWrapper
编辑2:一个例子可以是这样的类
class Sequence : IMix
{
List<int> sequence;
double period;
double weight;
}
在这种情况下,"Mix"需要返回这样构建的Sequence
:结果周期是基于权重的周期加权平均值。权重是权重的总和,序列是按时间尺度缩小到结果周期后序列的加权平均值。我只想说,任何你能想到的复杂方法都需要考虑
如果你想计算某个列表的平均值,那么你可以使用LINQ:
var value = list.Average(x => x.SomeProperty);
将类型T
放在您的接口上,并在实现它时使用与类相同的类型填充它:
public interface IMix<T>
{
T Mix(List<T> values);
}
public class ConcreteObjects : IMix<ConcreteObjects>
{
public ConcreteObjects Mix(List<ConcreteObjects> values)
{
// do mixing
}
}
这也为其他类打开了一扇门,如果需要的话,它们可以混合使用ConcreteObjects
我想你是在找一个extension method
。
您需要在某处定义一个静态方法(我想是某个helper类),像这样:
public static T Average<T>(this List<T> list) where T : IAverage
{
return // average stuff
}
现在你只需要包含你的辅助类与using
,你可以做这样的事情:AverageClass
实现IAverage
List<IAverage> list = new List<AverageClass>();
var average = list.Average();