2010-04-29 62 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;