如何在所有实现类上提供接口上的扩展方法?

时间:2016-09-17 20:33:59

标签: c# interface extension-methods

我有一个 Triangle 类,我在类型 List< Triangle> 中添加了一个扩展方法,如下所示。它可以像人们期望的那样工作。

public static string Export(this List<Triangle> self) { ... }

但是,我还有其他类,比如 Rectangle Trapezoid ,它们需要每个自己的 Export 函数,就像这样。

public static string Export(this List<Rectangle> self) { ... }
public static string Export(this List<Trapezoid> self) { ... }

由于其中的代码方法完全相同,并且对于任何新类型的数字都是如此,我想出(得到它?想出 out)它适合于去寻找一个界面。因此,这些类现在正在实现 IFigure ,这使我可以合并扩展中的代码,如下所示。

    public static string Export(this List<IFigure> self) { ... }

唯一的问题是现在代码没有编译,因为特定实现的列表并不知道扩展方法。我必须更改返回该类型的所有方法,例如列出到返回类型列表&lt; IFigure&gt; ,它似乎很多工作。除此之外,我担心我需要将这些列表转换为除导出之外的所有操作的实际实现的类。

是否可以在接口类型上使用扩展方法,以便它涵盖所有实现类?

2 个答案:

答案 0 :(得分:3)

IEnumerable&lt;&gt;上的扩展方法会工作

public static string Export(this IEnumerable<IFigure> self) { ... }

答案 1 :(得分:2)

您可以使用泛型来解决问题:

public static string Export<TFigure>(this List<TFigure> self)
    where TFigure : IFigure
{ ... }

在方法内部,您将在自我列表中的元素上拥有IFigure的所有属性/方法。

它适用于IFigure本身列表或任何继承类型

new List<IFigure>().Export();
new List<Triangle>().Export();

TFigure只是通用声明的名称(它可以是任何东西,或只是T来保持简单)。 其中TFigure:IFigure 将告诉编译器它应该只接受实现IFigure的类型。这称为通用约束。