2011-05-16 4 views
26

다음과 같이 정의 된 인터페이스가 있습니다.List <interface>을 List <concrete>로 변환하려면 어떻게합니까?

public interface MyInterface { 
    object foo { get; set; }; 
} 

및 그 인터페이스를 구현하는 클래스 :

public class MyClass : MyInterface { 
    object foo { get; set; } 
} 

다음과 같이 ICollection을 반환하는 함수를 만듭니다.

public ICollection<MyClass> Classes() { 
    List<MyClass> value; 

    List<MyInterface> list = new List<MyInterface>(
     new MyInterface[] { 
      new MyClass { 
       ID = 1 
      }, 
      new MyClass { 
       ID = 1 
      }, 
      new MyClass { 
       ID = 1 
      } 
     }); 

    value = new List<MyClass>((IEnumerable<MyClass>) list); 

    return value; 
} 

It 컴파일하지만

타입을 던질 수 없습니다. 'System.Collections.Generic.List 1[MyInterface]' to type 'System.Collections.Generic.IEnumerable 1 [MyClass]'유형의 객체를 형 변환 할 수 없습니다.

예외입니다. 내가 뭘 잘못하고 있죠?

답변

43

List<MyInterface>은 일반적으로 List<MyClass>로 변환 할 수 없습니다.

return list.ConvertAll(o => (MyClass)o); 
+6

System.Collections.Generic.List <>가 ConvertAll ()을 직접 지원하므로 .Net 2.0 이상에서 작동하며 LINQ가 아닙니다. –

+0

고마워, @ 리치. 나는 ConvertAll이 Linq 방법이라고 생각했지만, 나는 검사하는 것을 꺼려하지 않았다. –

+0

이것은 마술을했습니다! 감사합니다 JSBangs. – acermate433s

24

을하지만 List<MyInterface> 단호 List<MyClass>되지 않습니다 : 귀하의 경우에 당신은 당신이 목록을 구축하고 단지 MyClass 개체가 포함되어 있는지 확인 할 수있는 방법을 알고 있기 때문에

그러나이 사용 Linq에 작업을 수행 할 수 있습니다 .

는 생각 : 다음

var cats = (List<Cat>)list; 

부조리

interface IAnimal { } 

class Cat : IAnimal { } 
class Dog : IAnimal { } 

var list = new List<IAnimal> { new Cat(), new Dog() }; 

!

또한

,

var cats = list.Cast<Cat>(); 

부조리!

또한

var cats = list.ConvertAll(x => (Cat)x); 

부조리!

대신, 당신은 내가 구체적인 클래스에 인터페이스를 변환 Automapper 매우 유용

var cats = list.OfType<Cat>(); 
+0

나는 본다. 구체적인 클래스에 인터페이스를 전달할 수 있기 때문에 혼란 스러웠습니다. 감사. – acermate433s

0

을 말할 수 있습니다.

관련 문제