2010-04-29 63 views
0

我有以下幾點:鑄造一流的接口和背部

public interface ICartItem 
{ 
    string Name { get; set; } 
} 

public class CartItem : ICartItem 
{ 
    public string Name { get; set; } 
} 

我然後創建一個列表,並將其轉換爲一個接口:

IList<CartItem> items = new List<CartItem>() 
{ 
    new CartItem() { Name = "MyItem" } 
}; 

IList<ICartItem> cartItems = items.Cast<ICartItem>().ToList(); 

有沒有辦法施展它再次出現,就像如下圖所示?

IList<CartItem> newList = cartItems as IList<CartItem>; 
+0

我很困惑 - 是有一個理由,爲什麼你不使用'名單'從一開始? – Treb 2010-04-29 08:00:30

+0

我可以但這個問題的目的是要找出是否有可能把它扔回去。 – Thomas 2010-04-29 08:04:40

回答

0

您是否需要該清單的副本?

如果是的話,你一定有在列表中只有CartItems你可以

IList<CartItem> newList = cartItems.Cast<CartItem>().ToList(); 

做但我認爲你想多一點健壯。在這種情況下,你可以試試

cartItems.Where(item => item as CartItem != null).Cast<CartItem>().ToList(); 

但我認爲你需要創建一個新的列表。我想不出一種與IList界面(IEnumerable<T>如上所示)工作方式相同。

0

這不是一個合乎邏輯的問題,因爲您無法確保'cartItems'列表中的所有項目都可以轉換爲'CartItem'類型。

0

基本上,答案是否定的,IList < ICartItem>不能被轉換回IList,因爲CartItem不是唯一可能實現ICartItem的類型。編譯器不能對類型進行類型檢查,因爲它不知道運行時列表中的內容。

在C#4,你可以這樣做:

 IEnumerable<CartItem> items = new List<CartItem> 
     { 
      new CartItem() { Name = "MyItem" } 
     }; 

     IEnumerable<ICartItem> cartItems = items; 

(即無需使用.Cast < ICartItem>()的ToList())

注意接口是IEnumerable的而不是IList <>,因爲在C#4中只有一些接口是協變的(完整列表cn在這裏找到:http://msdn.microsoft.com/en-us/library/dd233059.aspx)。

然而,即使在C#4,將下面的行會導致編譯失敗:

 IEnumerable<CartItem> newList = cartItems;