2010-04-29 4 views
0

У меня есть следующие:Casting класс интерфейс и обратно

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

Я перепутал - есть причина, почему вы не используете 'List ' с самого начала ? – Treb

+0

Я мог бы, но цель вопроса - выяснить, можно ли даже вернуть его обратно. – Thomas

ответ

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; 
Смежные вопросы