我有以下代码:
public IList<MyObject> GetSomeData(string inputParam)
{
var temp = repository.GetData(inputParam);
var list = temp as List<MyObject>;
return list;
}
repository.GetData的返回值为IEnumerable<IMyObject>
当我查看temp的值时,它有400多条记录。我把它投射到列表的那一刻,它变成了空。为什么这个演员不可能?
答案 0 :(得分:4)
它返回null,因为IEnumerable
实际上不是列表。只有当IEnumerable
碰巧是List
而不是其他类型的序列时,强制转换才会成功。如果您想要一个列表,则需要创建一个新列表并将序列中的项添加到该列表中。
答案 1 :(得分:3)
除非从repository.GetData
返回的值的基础对象与您尝试将其投射到的值匹配,否则结果将始终为null
。由于方法的通用元素类型和实际从repository.GetData
返回的内容是不同的,因此您需要进行一些转换才能获得所需的结果
假设MyObject
实现IMyObject
我至少可以考虑使用System.Linq
获取您所寻求的结果。
选项1:Cast<T>()
将System.Collections.IEnumerable的元素转换为指定的类型。
首先使用temp
linq扩展转换Cast<MyObject>()
的内容,然后使用ToList<T>()
扩展方法为您提供结果IList<MyObject>
public IList<MyObject> GetSomeData(string inputParam)
{
//repository.GetData returns IEnumerable<IMyObject>
var temp = repository.GetData(inputParam);
var list = temp.Cast<MyObject>().ToList();
return list;
}
选项2:OfType<T>()
根据指定的类型过滤System.Collections.IEnumerable的元素。
使用temp
linq扩展程序过滤OfType<MyObject>()
的内容,然后使用ToList<MyObject>()
扩展程序获得结果IList<MyObject>
public IList<MyObject> GetSomeData(string inputParam)
{
//repository.GetData returns IEnumerable<IMyObject>
var temp = repository.GetData(inputParam);
var list = temp.OfType<MyObject>().ToList();
return list;
}