【问题标题】:In C#, what is the recommended way to cast a List of Interface to a list of objects?在 C# 中,将接口列表转换为对象列表的推荐方法是什么?
【发布时间】:2015-11-25 15:22:33
【问题描述】:

我有返回的代码和 IVehicle 接口数组

  IEnumerable<IVehicle> allVehicles = GetAllVehicles();

而且我知道所有这些对象都是 Car 对象。什么是正确的投射方式

IEnumerable<IVehicle>

IEnumerable<Car>

因为我需要将这些传递给另一个需要&lt;Enumerable&lt;Car&gt;的函数

【问题讨论】:

标签: c# collections casting


【解决方案1】:

你可以这样投射:

var allCars = allVehicles.Cast<Car>();

【讨论】:

  • 值得注意的是,由于IEnumerable&lt;T&gt; 的协方差,allVehicles 实际上已经是IEnumerable&lt;Car&gt;Cast 认为有机会将整个操作优化为一个单一的演员,这意味着。
  • 那是铸造集合。它正在创建一个基于其中的项目的全新集合。那是完全不同的。
【解决方案2】:

我不确定这是否真的需要,但可以使用如下 Linq 扩展方法来完成。

IEnumerable<Car> Cars = allVehicles.Cast<Car>();

但是,如果allVehicles 中的成员之一不是 Car,这将引发异常;如果需要,可以按如下方式规避。

IEnumerable<Car> Cars = allVehicles.OfType<Car>().Cast<Car>();

【讨论】:

  • 你不需要在OfType的结果上调用Cast
  • @JonHanna 谢谢你的评论,我不知道。
猜你喜欢
  • 2011-01-01
  • 2011-11-26
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
相关资源
最近更新 更多