Список актеров список


public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}

как я могу бросить List<Client> to List<IDic>?

7 73

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();
List<Client> listOfA = new List<Client>();
List<IDic> list = listOfA.Cast<IDic>().ToList();

это возможно только путем создания нового List<IDic> и передача всех элементов.

в .Net 3.5, вы можете сделать следующее:

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());

конструктор для списка в этом случае принимает IEnumerable.
список хотя только конвертируется в IEnumerable. Даже если myObj может быть конвертируемым в ISomeInterface тип IEnumerable не конвертируется в IEnumerable.