我有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.
我做错了什么,又叫我怎么愚蠢?我是否需要循环通过阵列?我不知道为什么,但我希望我不必那样做。
答案 0 :(得分:1)
您可以使用LINQ将枚举的对象强制转换为其他相关类型。
pInfo.Cast<PInfo3>();
现在,如果集合中有一些无法投射的元素,这可能会导致一些问题,但也有办法(参见编辑):
<击> pInfo.Select(p => (PInfo3)p).Where(p => p != null);
击>
当知道转换成功时,应使用Cast
,而当可能存在无法进行转换的元素时,应使用第二个。
修改强>
根据Daniel A. White的评论,还有.OfType<T>()
方法,它只会获取与所请求类型匹配的项目,并避免IllegalCastException
将Cast<T>()
抛出
有关其他详细信息,请参阅this answer。