Список актеров список
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.