繁体   English   中英

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

[英]How to make an extension method on interface available on all implementing classes?

我有一个Triangle类,并且向List <Triangle>类型添加了一个扩展方法,如下所示。 就像人们期望的那样。

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

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

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

由于它的方法是完全一样的,今后仍将如此对任何新的数字的代码,我想通了,(怎么做呢? 想通了),它是适合去的接口。 因此,这些类现在正在实现IFigure ,这使我可以将扩展中的代码合并,如下所示。

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

唯一的问题是,由于特定实现的列表不知道扩展方法,因此现在代码无法编译。 我将不得不更改所有返回类型的方法,例如将List更改为返回类型List <IFigure> ,这似乎需要大量工作。 除此之外,我担心我接下来将需要为导出以外的所有操作将这些列表转换为实际的实现的类。

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

IEnumerable <>的扩展方法将起作用

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

您可以使用泛型来解决:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM