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

中定义body编辑:为了澄清一些误解,这些不是真正的数学平均值,我可以很容易地说"熔合"或其他任何东西。例如,我可以尝试"平均"某个结构或其他类的列表。

编辑2:一个例子可以是这样的类

class Sequence : IMix
{
    List<int> sequence;
    double period;
    double weight;
}

在这种情况下,"Mix"需要返回这样构建的Sequence:结果周期是基于权重的周期加权平均值。权重是权重的总和,序列是按时间尺度缩小到结果周期后序列的加权平均值。我只想说,任何你能想到的复杂方法都需要考虑

c#类型参数约束

如果你想计算某个列表的平均值,那么你可以使用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();