Список актеров список
public interface IDic
{
int Id { get; set; }
string Name { get; set; }
}
public class Client : IDic
{
}
как я могу бросить List<Client> to List<IDic>?
7 ответов:
нельзя литой it (сохранение ссылочной идентичности) - это было бы небезопасно. Например:
public interface IFruit {} public class Apple : IFruit {} public class Banana : IFruit {} ... List<Apple> apples = new List<Apple>(); List<IFruit> fruit = apples; // Fortunately not allowed fruit.Add(new Banana()); // Eek - it's a banana! Apple apple = apples[0];теперь вы можете преобразовать
List<Apple>доIEnumerable<IFruit>в .NET 4 / C# 4 из-за ковариации, но если вы хотитеList<IFruit>вам придется создать новая список. Например:// In .NET 4, using the covariance of IEnumerable<T> List<IFruit> fruit = apples.ToList<IFruit>(); // In .NET 3.5 List<IFruit> fruit = apples.Cast<IFruit>().ToList();но это не то же самое, что кастинг исходного списка - потому что теперь есть два отдельные списки. Это безопасно, но вам нужно поймите, что изменения внесены в один список не можно увидеть в другом списке. (Изменения в объекты что списки относятся к будет видно, конечно.)
итератор приведения И.Список():
List<IDic> casted = input.Cast<IDic>().ToList()будет делать трюк.и первоначально я тоже тупо остановился
ToList()вызов
у меня тоже была эта проблема, и после прочтения ответа Джона Скита я изменил свой код с помощью
List<T>использоватьIEnumerable<T>. Хотя это не отвечает на исходный вопрос OP как я могу броситьList<Client>доList<IDic>, это позволяет избежать необходимости делать это и, таким образом, может быть полезно для других, кто сталкивается с этой проблемой. Это конечно предполагает, что код, который требует использованияList<IDic>находится под вашим контролем.например:
public void ProcessIDic(IEnumerable<IDic> sequence) { // Implementation }вместо оф:
public void ProcessIDic(List<IDic> list) { // Implementation }
Если вы можете использовать LINQ, то вы можете сделать это...
List<Client> clientList = new List<Client>(); List<IDic> list = clientList.Select(c => (IDic)c).ToList();
в .Net 3.5, вы можете сделать следующее:
List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());конструктор для списка в этом случае принимает IEnumerable.
список хотя только конвертируется в IEnumerable. Даже если myObj может быть конвертируемым в ISomeInterface тип IEnumerable не конвертируется в IEnumerable.