![](/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.