C#类型参数约束

C#类型参数约束,c#,generics,interface,C#,Generics,Interface,我正试图以某种方式做某事。。。但我肯定有更好的办法 public interface IMix { T Mix<T>(List<T> values) where T : IMix; } 但这显然行不通,因为我必须在MixWrapper 编辑:为了澄清一些误解,这些不是真正的数学平均值,我可以很容易地说“Fuse”或其他任何东西。例如,我可以尝试“平均”某个结构或其他类的列表 编辑2: 一个例子可以是这样的类 class Sequence : IMix {

我正试图以某种方式做某事。。。但我肯定有更好的办法

public interface IMix
{
    T Mix<T>(List<T> values) where T : IMix;
}
但这显然行不通,因为我必须在
MixWrapper

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

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

class Sequence : IMix
{
    List<int> sequence;
    double period;
    double weight;
}
类序列:IMix
{
列表顺序;
双周期;
双倍重量;
}

这种情况下的“Mix”需要返回一个以这种方式构建的
序列
:结果周期是基于权重的周期加权平均值。权重是权重之和,而序列是将时间尺度缩小到结果周期后序列的加权平均值。可以这么说,您可能想到的任何复杂方法都需要考虑

如果您想计算某个列表的平均值,那么您可以使用:


我认为您正在寻找一种
扩展方法

您需要在某个地方(我想是某个助手类)定义一个静态方法,如下所示:

public static class MixWrapper
{
    public static T Mix<T>(List<T> values);
}
public static T Average<T>(this List<T> list) where T : IAverage
{
    return // average stuff
}

将类型
T
放在您的接口上,并在实现时使用与类相同的类型填充它:

公共接口IMix { T混合(列表值); } 公共类对象:IMix { 公共对象混合(列表值) { //混合 } }
这也为其他类在需要时能够混合具体对象打开了大门。

您的第二种方法本质上是
可枚举类如何实现的。为什么不那样做呢?因此,为什么不直接调用
Average
扩展方法呢?或者有什么你没有告诉我们的,比如你需要一个方法来提取将被平均的值?我想你真正要问的是“我如何将它约束到支持+和/运算符的类型?”因为你需要这些运算符来计算平均值。这是不可能的,对.NET泛型的一个相当臭名昭著的限制。@Jay编辑后,不清楚您想要实现什么。你能举一些平均/融合/混合的例子吗?可以,但有人回答了这个问题。。。尽管如此,对于完整性,但我不想只对一个属性进行平均,我想“混合”一组属性together@Jay您可以使用选择器,它将计算多个属性的平均值。例如,
list.Average(x=>x.SomeProperty+x.OtherProperty)
。选择器只是
Func
类型的委托,它接受序列中的变量并返回一些值,这些值将用于计算平均值。不,它不是真正的平均值。它更接近标准偏差。看到我更新的问题这么简单。。。我不知道为什么我没有想到这一点。现在我只希望在接口中有静态方法。
public static T Average<T>(this List<T> list) where T : IAverage
{
    return // average stuff
}
List<IAverage> list = new List<AverageClass>();
var average = list.Average();