将接口列表强制转换为实现列表,反之亦然

本文关键字:列表 实现 反之亦然 接口 转换 | 更新日期: 2023-09-27 18:13:29

我只是不知道如何将List<ISomeImplementation>转换或强制转换为List<SomeImplementation>

// lstOfImplemantation is of type `List<SomeImplementation>`
    List<ISomeImplementation> lstOfInterfaces = lstOfImplemantation; // how to convert it.

任何帮助都将不胜感激。

将接口列表强制转换为实现列表,反之亦然

您可以通过一种方式使用LINQ:

List<ISomeImplementation> lstOfInterfaces = lstOfImplemantation.Cast<IISomeImplementation>().ToList();

将接口转换为实现并不是一个好的做法。如果该接口还有其他实现呢?不能假设所有的implementation都是类型为SomeImplementation的。如果确定,请使用List<SomeImplementation>

仅仅因为A源自B,并不一定意味着X<A>源自X<B>

事实上,List<T>在其泛型类型参数T中是不变量。这意味着List<string>既不是List<object>的亚型,也不是超型,即使string源自object

想象一下,如果您的接口列表包含类型为SomeOtherImplementation的实例。演员阵容将如何运作?

相反,您应该创建一个新的列表,并将接口列表中的每个项强制转换为具体类型。

List<SomeImplementation> lstOfImplementation =
             lstOfInterfaces.Cast<SomeImplementation>()
                            .ToList();

如果您不确定是否所有实例都是SomeImplementation类型,那么可以使用OfType<T>过滤掉那些不是的实例。

List<SomeImplementation> lstOfImplementation =
             lstOfInterfaces.OfType<SomeImplementation>()
                            .ToList();

另请阅读:

  • 协方差与反方差
  • 协方差和方差常见问题