如何使用泛型类型简化此代码?

时间:2011-10-11 05:51:48

标签: c# generics

private delegate T MyFunc<T>(int i);

private static double SumNumber(int i, int n, MyFunc<double> func)
{
    double sum = 0.0;
    for (int j = i; i <= n; j++)
    {
        sum += func(j);
    }
    return sum;
}

private static Vector SumVector(int i, int n, MyFunc<Vector> func)
{
    Vector sum = new Vector(0.0, 0.0);
    for (int j = i; i <= n; j++)
    {
        sum += func(j);
    }
    return sum;
}

这是一个计算MyFunc(j)之和的程序,其中j是i到n。

我尝试使用如下界面:

interface IAddable<T>
{
    static T operator +(T x, T y);
}

但它不起作用。

那我该怎么办?

1 个答案:

答案 0 :(得分:6)

首先请注意,在许多方面,非泛型过载版本更简单。泛型不支持运算符,也不支持接口。

的确,如果 Sum方法可用于您的类型(可能通过IEnumerable<T>上的扩展方法),调用者可以使用:

var data = sourceData.Select(projection).Sum();

其中projectionfunc的道德等价物。

为了实现您的方式,您可能首先尝试的是dynamic

private static T Sum<T>(int i, int n, Func<int,T> func)
{
    if(i >= n) throw new ArgumentOutOfRangeException();
    T sum = func(i);
    for (int j = i + 1; i <= n; j++)
    {
        sum = (dynamic)sum + (dynamic)func(j);
    }
    return sum;
}

否则,你可以做一些伪造泛型运算符的技巧(参见MiscUtil),或者你可以传递累加器方法(即Func<T,T,T> add)作为参数。