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

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

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

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

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

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

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

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

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

问候内姆

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

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

 public class Matrix where T : new() { public T[,] values; } public static class MatrixExtension { public static T getCalcResult(this Matrix mat) where T : new() { T result = new T(); return result; } } class Program { static void Main(string[] args) { Matrix m = new Matrix(); int aNumber = m.getCalcResult(); Console.WriteLine(aNumber); //outputs "0" } 

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

 T result = 0; 

您可以将其更改为:

 T result = default(T); 

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

但是,当您进入列出的“……”部分时,您会发现这很困难。 基本类型( intdouble等)不实现可用于计算数学的方法。 对于Connect ,这是一个很长时间,非常高度投票的请求 ,顺便说一句。

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

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

显示装饰器图案的示例

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

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