如何将对象数组转换为IEnumerable的继承对象?

时间:2015-03-03 17:16:04

标签: c#

我有PInfo2[] pInfo,需要将其用作IEnumerable<PInfo3> betterInfo public class PInfo3 : PInfo2

我尝试过但不起作用:

(IEnumerable<PInfo3>)pInfo //Runtime error: "Unable to cast object of type 'PInfo2[]' to type 'System.Collections.Generic.IEnumerable`1[

IEnumerable<PInfo3> betterInfo = pInfo as IEnumerable<PInfo3>; //Always null after cast.

我做错了什么,又叫我怎么愚蠢?我是否需要循环通过阵列?我不知道为什么,但我希望我不必那样做。

1 个答案:

答案 0 :(得分:1)

您可以使用LINQ将枚举的对象强制转换为其他相关类型。

pInfo.Cast<PInfo3>();

现在,如果集合中有一些无法投射的元素,这可能会导致一些问题,但也有办法(参见编辑):

<击> pInfo.Select(p => (PInfo3)p).Where(p => p != null);

知道转换成功时,应使用Cast,而当可能存在无法进行转换的元素时,应使用第二个。

修改

根据Daniel A. White的评论,还有.OfType<T>()方法,它只会获取与所请求类型匹配的项目,并避免IllegalCastExceptionCast<T>()抛出

有关其他详细信息,请参阅this answer