我正在使用特定于任务的.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
答案 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);
在值类型的情况下,这将为零,因此它是安全的。
然而,当你到达你列出的“......”部分时,你会发现这很难。基本类型(int
,double
等)没有实现可用于计算数学的方法。这是long time, very highly voted request on Connect,顺便说一句。
虽然有解决方法,但它们使生活变得非常困难。与C ++中的模板不同,C#的泛型实际上不支持对任意类型的类型安全数学运算。
答案 2 :(得分:-2)
你有没有看过“装饰者”......
Sample showing Decorator patterns
装饰器允许您创建具有自己的属性和方法的类,而无需从一个特定类直接派生。然后,您可以将其“应用”到几乎任何其他对象。然后,您可以使用您正在尝试使用的额外方法或属性。
这个样本是一个简单的快速查找,显示这样一个例子通过构建“选项”将自己附加到“汽车”......