C# Cast IEnumerable<;对象>;列出<;对象>;
我有以下代码:C# Cast IEnumerable<;对象>;列出<;对象>;,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,我有以下代码: public IList<MyObject> GetSomeData(string inputParam) { var temp = repository.GetData(inputParam); var list = temp as List<MyObject>; return list; } public IList GetSomeData(字符串inputParam) { var temp=repository.GetDat
public IList<MyObject> GetSomeData(string inputParam)
{
var temp = repository.GetData(inputParam);
var list = temp as List<MyObject>;
return list;
}
public IList GetSomeData(字符串inputParam)
{
var temp=repository.GetData(inputParam);
var列表=临时as列表;
退货清单;
}
repository.GetData的返回值为IEnumerable
当我查看temp的值时,它有400多条记录。当我将其转换为list时,它将变为null。为什么不能执行此强制转换?它返回null,因为
IEnumerable
实际上不是一个列表。只有当特别是IEnumerable
恰好是列表而不是其他类型的序列时,转换才会成功。如果您想拥有一个列表,则需要创建一个新列表,并将序列中的项目添加到该列表中。除非从存储库返回的值的基础对象。GetData
与您试图将其强制转换到的对象相匹配,否则结果将始终为null
。因为方法的泛型元素类型和从repository.GetData
实际返回的内容是不同的,所以需要进行一些转换以获得所需的结果
假设MyObject
实现了IMyObject
,我至少可以想到使用System.Linq
来获得所需结果的方法
选项1:Cast()
将System.Collections.IEnumerable的元素强制转换为指定类型
首先使用Cast()
linq扩展转换temp
的内容,然后使用ToList()
扩展方法获得结果IList
var list=temp.ToList()因为您的IEnumerable
不是列表
IEnumerable
s有许多形状和大小,其中许多不是List
s。尝试改用.ToList()
。不要使用as
在C#中强制转换。如果temp
不是列表,请使用(List)temp
,除非您希望List
为null
。请参阅此项,也请参阅。还要确保MyObject
实际实现了IMyObject
,并且列表中返回的实例都是具体类型的MyObject
。为什么不返回一个IEnumerable
?没有理由在该方法中返回列表
。当我返回.ToList时的问题是它想要列表
作为返回类型,我需要序列化对象。如果这样返回对象,我似乎无法将其序列化。@Bagzli然后只使用List
constructor.IEnumerable已经实现了ToList()。它将泛型类型推断为T的列表,因此,除非MyObject从泛型类型继承,否则不需要这样做class@OctanicIEnumerable未实现ToList()。事实上,我应该把它称为IEnumerable。。。请检查:@nkositos是扩展方法。IEnumerable公开枚举器,该枚举器支持对指定类型的集合进行简单迭代。
因此它只有一个方法(单一责任)GetEnumerator()
是,但实际上,不需要使用cast或oftype来执行tolist@科西
public IList<MyObject> GetSomeData(string inputParam)
{
//repository.GetData returns IEnumerable<IMyObject>
var temp = repository.GetData(inputParam);
var list = temp.Cast<MyObject>().ToList();
return list;
}
public IList<MyObject> GetSomeData(string inputParam)
{
//repository.GetData returns IEnumerable<IMyObject>
var temp = repository.GetData(inputParam);
var list = temp.OfType<MyObject>().ToList();
return list;
}