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;
}