![](/img/trans.png)
[英]Cast received object to a List<object> or IEnumerable<object>
[英]Cast IEnumerable<object> to List<object>
我有以下代码:
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多条记录。 我把它投射到列表的那一刻,它变成了空。 为什么这个演员不可能?
它返回null,因为IEnumerable
实际上不是列表。 只有当特别是IEnumerable
碰巧是List
而不是其他类型的序列时, IEnumerable
才会成功。 如果要有列表,则需要创建新列表并将序列中的项添加到该列表中。
除非从repository.GetData
返回的值的基础对象与您尝试将其转换为的内容匹配,否则结果将始终为null
。 因为方法的泛型元素类型和从repository.GetData
实际返回的内容是不同的,所以您需要进行一些转换才能获得所需的结果
假设MyObject
实现了IMyObject
我至少可以想到使用System.Linq
获取你寻求的结果的方法。
选项1: Cast<T>()
将System.Collections.IEnumerable的元素转换为指定的类型。
首先使用Cast<MyObject>()
linq扩展转换temp
的内容,然后使用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的元素。
使用OfType<MyObject>()
linq扩展名过滤temp
的内容,然后使用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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.