如何在C#中将对象数组中的每个对象转换为对应类型实例?
解决方案
错误原因
你的写法会对数组中所有元素尝试强制转换,比如获取Cat时,遍历到Dog或Bird实例时,强制转换会直接抛出InvalidCastException,而非跳过不符合类型的元素。
正确实现方式
使用LINQ的OfType<T>()方法,它会先筛选出数组中属于T类型(或其派生类型)的元素,再返回强类型集合,避免转换失败的异常:
using System.Linq; // 安全获取Cat实例,不存在则返回null Cat cat = data.OfType<Cat>().FirstOrDefault(); // 安全获取Dog实例,不存在则返回null Dog dog = data.OfType<Dog>().FirstOrDefault(); // 安全获取Bird实例,不存在则返回null Bird bird = data.OfType<Bird>().FirstOrDefault();
替代写法(等价效果)
如果不想用OfType<T>(),也可以通过Where筛选+Cast转换的组合实现:
Cat cat = data.Where(x => x is Cat).Cast<Cat>().FirstOrDefault();
说明
- 两种写法都会先检查元素类型,仅对符合条件的元素进行转换,不会抛出类型转换异常。
- 如果数组中不存在目标类型的实例,
FirstOrDefault()会返回对应类型的默认值(引用类型为null,值类型为default(T))。
内容的提问来源于stack exchange,提问作者Marija Magdalena Bašić
相关产品推荐
相关产品推荐

