C#类型参数约束

时间:2012-12-25 19:46:57

标签: c# generics interface

我正试图以某种方式做某事......但我确信有更好的方法

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

在这种情况下,“混合”需要返回以这种方式构建的Sequence:结果期间是基于权重的期间的加权平均值。权重是权重的总和,并且序列是在将时间尺度缩减到结果周期之后的序列的加权平均值。可以说,任何你能想到的复杂方法都需要考虑

3 个答案:

答案 0 :(得分:4)

如果您想计算某些列表的平均值,则可以使用LINQ

var value = list.Average(x => x.SomeProperty);

答案 1 :(得分:2)

将类型T放在您的界面上,并在实施时将其填充为与类相同的类型:

public interface IMix<T>
{
    T Mix(List<T> values);
}

public class ConcreteObjects : IMix<ConcreteObjects>
{
    public ConcreteObjects Mix(List<ConcreteObjects> values)
    {
        // do mixing
    }
}

这也为其他类打开了大门,以便能够在需要时混合ConcreteObjects。

答案 2 :(得分:1)

我认为你正在寻找extension method

你需要在某处定义一个静态方法(我想是一些帮助类),如下所示:

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();