2009-12-10 108 views
9

由於某種原因,我的老闆喜歡創建自定義類型來表示一個通用列表(即使在大多數情況下他的自定義類型沒有成員!我認爲他只是懶惰,不喜歡輸入列表或其他東西,但對我來說,這是不好的,並且在下面的問題中導致我很多頭痛。因此,當我使用標準列表(mabye我恨他的自定義類,喜歡使用像他們應該使用普通的.NET類型),或者我可能使用LINQ表達式如b elow,我總是碰到鑄造的問題,即使自定義類型是從列表無法投射'System.Collections.Generic.List`1 [Item]'類型的對象來鍵入'ItemList'

private ItemList someMethod(ItemList itemList) 
{ 
    ... 
    itemList = (ItemList)items.Where(x => x.ItemType != ItemType.Car && x.ItemType != ItemType.Truck).ToList(); 

    return itemList; 
    .... 
} 
+0

到底是什麼問題嗎? – 2009-12-10 17:25:20

+0

我得到的錯誤...這是在帖子標題 – PositiveGuy 2009-12-10 17:37:48

+1

這是必要的一個例子是在WinForms綁定。如果你想使用設計師,你必須有一個特定的類。這在使用Infragustics等第三方控件時尤其方便。 – fuzzbone 2011-10-31 20:32:21

回答

6

由於Grzenio points out,您不能使用ToList()和演員,但你可以創建自己的擴展方法來從一個序列創建派生類型的實例:

public static TDerived CreateFromEnumerable<TDerived, T>(this IEnumerable<T> seq) where TDerived : List<T>, new() 
     { 
      TDerived outList = new TDerived(); 
      outList.AddRange(seq); 
      return outList; 
     } 

因此,對於你比如你會做:

ItemList outList = itemList 
    .Where(x => x.ItemType != ItemType.Car && x.ItemType != ItemType.Truck) 
    .CreateFromEnumerable<ItemList, Item>(); 
+1

我給了這個答案,因爲這是在我的頭上,因此這是一個很好的例子來解釋「推斷」的解決方案。我不是通用方法的專家。 – PositiveGuy 2009-12-10 17:52:10

+0

這也適用於我...以及謝謝。 – 2010-12-20 21:37:06

2

不幸的是ToList()繼承會返回一個正常的列表,而不是ItemnList,所以你可以不投它。我真的沒有看到一個合理的解決方法,將List封裝在ItemnList中可能會更好,而不是從它派生。

+1

通過在ItemList中封裝列表,你是什麼意思? – PositiveGuy 2009-12-10 17:37:16

+1

「正常列表」是什麼意思...... IEnumerable? – PositiveGuy 2009-12-10 17:54:32

相關問題