如何使接口上的扩展方法在所有实现 类 上可用?
How to make an extension method on interface available on all implementing classes?
我有一个 class Triangle 并且我向类型 List 添加了一个扩展方法,如下所示.正如人们所期望的那样工作。
public static string Export(this List<Triangle> self) { ... }
但是,我还有其他 classes,例如 Rectangle 和 Trapezoid,它们需要各自 导出函数,像这样。
public static string Export(this List<Rectangle> self) { ... }
public static string Export(this List<Trapezoid> self) { ... }
由于其中的代码,方法完全相同,并且对于任何新类型的图形都将保持不变,我发现(明白了吗?发现)它是合适的去寻找一个界面。因此,classes 现在正在实施 IFigure,这使我能够合并扩展中的代码,如下所示。
public static string Export(this List<IFigure> self) { ... }
唯一的问题是现在代码无法编译,因为特定实现的列表不知道扩展方法。我将不得不更改 return 类型的所有方法,例如List 到 returning 类型 List 看起来工作量很大。除此之外,我担心我需要将这些列表转换为除导出之外的所有操作的实际实现 classes。
是否可以在接口类型上有一个扩展方法,以便它涵盖所有实现 classes?
IEnumerable<> 上的扩展方法将起作用
public static string Export(this IEnumerable<IFigure> self) { ... }
您可以使用泛型来解析:
public static string Export<TFigure>(this List<TFigure> self)
where TFigure : IFigure
{ ... }
在该方法中,您将在 self 列表中的元素上拥有 IFigure 的所有 properties/methods。
它适用于 IFigure 本身或任何继承类型的列表
new List<IFigure>().Export();
new List<Triangle>().Export();
TFigure 只是通用声明的名称(它可以是任何东西,也可以只是 T 以保持简单)。 where TFigure : IFigure 将告诉编译器它应该只接受实现 IFigure 的类型。这称为通用约束。
我有一个 class Triangle 并且我向类型 List
public static string Export(this List<Triangle> self) { ... }
但是,我还有其他 classes,例如 Rectangle 和 Trapezoid,它们需要各自 导出函数,像这样。
public static string Export(this List<Rectangle> self) { ... }
public static string Export(this List<Trapezoid> self) { ... }
由于其中的代码,方法完全相同,并且对于任何新类型的图形都将保持不变,我发现(明白了吗?发现)它是合适的去寻找一个界面。因此,classes 现在正在实施 IFigure,这使我能够合并扩展中的代码,如下所示。
public static string Export(this List<IFigure> self) { ... }
唯一的问题是现在代码无法编译,因为特定实现的列表不知道扩展方法。我将不得不更改 return 类型的所有方法,例如List 到 returning 类型 List
是否可以在接口类型上有一个扩展方法,以便它涵盖所有实现 classes?
IEnumerable<> 上的扩展方法将起作用
public static string Export(this IEnumerable<IFigure> self) { ... }
您可以使用泛型来解析:
public static string Export<TFigure>(this List<TFigure> self)
where TFigure : IFigure
{ ... }
在该方法中,您将在 self 列表中的元素上拥有 IFigure 的所有 properties/methods。
它适用于 IFigure 本身或任何继承类型的列表
new List<IFigure>().Export();
new List<Triangle>().Export();
TFigure 只是通用声明的名称(它可以是任何东西,也可以只是 T 以保持简单)。 where TFigure : IFigure 将告诉编译器它应该只接受实现 IFigure 的类型。这称为通用约束。