[c#] List <T>를 List <Interface>로 캐스팅

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

}

어떻게 캐스트 List<Client>할 수 List<IDic>있습니까?



답변

캐스팅 할 수 없습니다 (참조 ID 유지)-안전하지 않습니다. 예를 들면 :

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];

이제 공분산으로 인해 .NET 4 / C # 4에서 a List<Apple>로 변환 할 수 IEnumerable<IFruit>있지만, 원하는 경우 목록 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();

그러나 이것은 원래 목록을 캐스팅하는 것과 동일 하지 않습니다 . 이제 두 개의 개별 목록 이 있기 때문 입니다. 이것은 안전하지만 한 목록에 대한 변경 사항이 다른 목록에 표시되지 않음 을 이해해야 합니다. ( 물론 목록이 참조 하는 개체 에 대한 수정 사항 이 표시됩니다.)


답변

캐스트 반복기 및 .ToList () :

List<IDic> casted = input.Cast<IDic>().ToList() 트릭을 할 것입니다.

원래 저는 공분산이 효과가 있다고 말했지만 Jon이 올바르게 지적했듯이; 안돼!

그리고 원래 나도 멍청하게 ToList()전화를 끊었 어


답변

나도이 문제를했고 존 소총의 답변을 읽은 후 내가 사용하는 내 코드를 수정 List<T>사용 IEnumerable<T>. 이것이 OP의 원래 질문 인 How can I cast List<Client>to에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>());

이 경우 List 생성자는 IEnumerable을 사용합니다.
목록 은 IEnumerable로만 변환 할 수 있습니다. myObj 를 ISomeInterface로 변환 할 수 있지만 IEnumerable 유형은 IEnumerable로 변환 할 수 없습니다.