如何使接口上的扩展方法在所有实现 类 上可用?

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,例如 RectangleTrapezoid,它们需要各自 导出函数,像这样。

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 的类型。这称为通用约束。