2017-11-30 9 views
1

사용자 정의 클래스에 제네릭 목록을 주조 :C#을 Linq에 내가이 같은 사용자 지정 컬렉션 클래스를 선언 한

내 코드에서
public class WipCommesse 
{   
    private string FNumCommessa; 
    private int FIdTipologia, FTotQtaLetta; 

    public int IdTipologia 
    { 
     get { return FIdTipologia; } 
     set { FIdTipologia = value; } 
    } 

    public string NumCommessa 
    { 
     get { return FNumCommessa; } 
     set { FNumCommessa = value; } 
    } 

    public int TotQtaLetta 
    { 
     get { return FTotQtaLetta; } 
     set { FTotQtaLetta = value; } 
    } 

} 

public class WipCommesseList : List<WipCommesse> 
{ 

} 

I 그룹 다른 목록에 Linq에를 사용하고 난 내 사용자 정의 형식으로 캐스팅 할

WipCommesseList wipGrouped = 
    (WipCommesseList)myList.GroupBy(x => new 
          { 
           x.IdTipologia, 
           x.NumCommessa 
          }). 
          Select(g => new WipCommesse() 
          { 
           IdTipologia = g.Key.IdTipologia, 
           NumCommessa = g.Key.NumCommessa, 
           TotQtaLetta = g.Sum(i => i.QtaLanciabile) 
          }).ToList(); 

클래스의 정의는 동일하지만 ToList() 메서드를 호출하면 System.Collection.Generic.List로 반환되고 캐스트가 실패합니다.

내 수업으로 올바르게 변환하려면 어떻게해야합니까?

답변

4
… 
Select(g => new WipCommesse() 
    { 
      IdTipologia = g.Key.IdTipologia, 
      NumCommessa = g.Key.NumCommessa, 
      TotQtaLetta = g.Sum(i => i.QtaLanciabile) 
    }).ToList(); 

이러한 결과는 List<WipCommesse> 것이다.

하지만 WipCommesseList으로 전송 중입니다. WipCommesseListList<WipCommesse> 인 반면 그 반대는 사실이 아닙니다. 런타임 유형이 기본 클래스 인 경우 오브젝트가 파생 유형이 아니기 때문에 다운 캐스팅 할 수 없습니다.

WipCommesseList에 명시적인 변환 연산자를 추가하면 변환을 허용하기 위해 List<WipCommesse>이 사용됩니다. WipCommesseList 인스턴스를 생성해야합니다.

3

List<WipCommesse>의 인스턴스를 WipCommesseList으로 전송할 수 없습니다. 파생 클래스에는 메서드/속성이 더 많이있을 수 있습니다. 인스턴스가 WipCommesseList에서 List<WipCommesse> 인 경우 캐스팅은 다른 방향으로 만 작동합니다. 클래스 WipCommesseList 당신이 당신의 질문에 정의 된대로 인 경우가 많은 일을하지 않고,

  1. 그리고 당신은 당신의 파일에 별명을 어쩌면, List<WipCommesse>을 사용할 수

    당신은 두 가지 솔루션을 가지고 WipCommesseList이 더 복잡한 경우 using WipCommesseList = List<WipCommesse>

  2. 당신은 ToList

유사한 기능을 가진 확장 메서드를 만들 수 있습니다 6,

코드 :

public static class WipCommesseListExtensions 
{ 
    public static WipCommesseList ToWipCommesseList(this IEnumerable<WipCommesse> source) 
    { 
     var list = new WipCommesseList(); 
     foreach (var item in source) 
     { 
      list.Add(item); 
     } 
    } 
} 
+0

세 번째 옵션은 생성자를 추가하여 WipCommesseList의 IEnumerable에서 새 개체를 만들 수 있으며 List 의 생성자 목록에있는 개체입니다. (아래 참조) – netniV

+0

@netniV 그래, 좋은 옵션이긴하지만 확장 메서드는 LINQ를 사용하는 것처럼 느껴진다. 그래서 나는이 방법을 선호한다. –

2

다음과 같이 코드를 변경해야합니다 :

public class WipCommesseList : List<WipCommesse> 
{ 
    public WipCommesseList() : base() 
    { 

    } 

    public WipCommesseList(int capacity) : base(capacity) 
    { 

    } 

    public WipCommesseList(IEnumerable<WipCommesse> collection) : base(collection) 
    { 

    } 
} 

이것은 당신이 캐스팅 할 수 있습니다 : 이것은 당신이 WipCommesseList에 다음 생성자를 가지고 있다고 가정

WipCommesseList wipGrouped = 
    new WipCommesseList(myList.GroupBy(x => new 
          { 
           x.IdTipologia, 
           x.NumCommessa 
          }). 
          Select(g => new WipCommesse() 
          { 
           IdTipologia = g.Key.IdTipologia, 
           NumCommessa = g.Key.NumCommessa, 
           TotQtaLetta = g.Sum(i => i.QtaLanciabile) 
          })); 

새로운 WipCommesseList 객체를 생성하여 WipCommessList에 WipCommesse를 기반으로하는 모든 열거 형을 지정합니다.