如何为类型参数约束的泛型类型编写扩展方法?

时间:2011-02-08 01:49:11

标签: c# .net methods generics

我正在使用特定于任务的.NET平台,它是预编译的而不是OpenSource。 对于某些任务,我需要扩展此类,但不是通过继承它。我只是想添加一个方法。

首先,我想向您展示一个虚拟代码现有类:

public class Matrix<T> where T : new() {
    ...
    public T values[,];
    ...
}

我想以下列方式扩展这个类:

public static class MatrixExtension {
    public static T getCalcResult<T>(this Matrix<T> mat) {
        T result = 0;
        ...
        return result;
    }
}

我从很多谷歌链接获得了这种语法,所以不知道它是否正确。编译器告诉我没有错误,但最终它不起作用。最后,我想以下列方式调用此函数:

Matrix<int> m = new Matrix<int>();
...
int aNumber = m.getCalcResult();

所以任何人都有了主意?谢谢你的帮助!

关心Nem

3 个答案:

答案 0 :(得分:23)

您需要在扩展方法上添加相同的类型参数约束。

这是我最近重建你编译和运行的例子的尝试,没有任何错误:

public class Matrix<T>  where T : new() {
     public T[,] values;
 }


 public static class MatrixExtension {
     public static T getCalcResult<T>(this Matrix<T> mat)  where T : new() {
         T result = new T();
         return result;
     }
 }

 class Program {
     static void Main(string[] args)  {
        Matrix<int> m = new Matrix<int>();
        int aNumber = m.getCalcResult();
        Console.WriteLine(aNumber); //outputs "0"
 }

答案 1 :(得分:2)

现在,我看到的唯一“错误”是:

T result = 0;

您可以将其更改为:

T result = default(T);

在值类型的情况下,这将为零,因此它是安全的。

然而,当你到达你列出的“......”部分时,你会发现这很难。基本类型(intdouble等)没有实现可用于计算数学的方法。这是long time, very highly voted request on Connect,顺便说一句。

虽然有解决方法,但它们使生活变得非常困难。与C ++中的模板不同,C#的泛型实际上不支持对任意类型的类型安全数学运算。

答案 2 :(得分:-2)

你有没有看过“装饰者”......

Sample showing Decorator patterns

装饰器允许您创建具有自己的属性和方法的类,而无需从一个特定类直接派生。然后,您可以将其“应用”到几乎任何其他对象。然后,您可以使用您正在尝试使用的额外方法或属性。

这个样本是一个简单的快速查找,显示这样一个例子通过构建“选项”将自己附加到“汽车”......