2009-11-07 5 views
2

제네릭으로 시작한 것만 큼 정확한 질문이없는 것 같아서 제 지식은별로 좋지 않습니다.일반 목록을 반환하는 방법은 무엇입니까?

public class Wrapper 
{ 
    public List<TInfoType> GetInfo<TInfoType>(Array data, EdmCmd edmCmd) 
    { 
     switch (edmCmd.meCmdType) 
     { 
     case EdmCmdType.EdmCmd_PostAdd: 
      List<EdmCmdPostAddInfo> info = new List<EdmCmdPostAddInfo>(); 
      foreach (EdmCmdData item in data) 
      { 
       info.Add(new EdmCmdPostAddInfo(item.mlObjectID1, item.mlObjectID2, item.mbsStrData1, item.mlLongData1)); 
      } 
      return info; 
      break;     
     default: 
      break; 
     } 
    } 
} 

그리고이 같은 메서드를 호출하고 싶습니다 :

List<EdmCmdPostAddInfo> info = wrapper.GetInfo<EdmCmdPostAddInfo>(data, edmCmd) 

이 작업을 수행하는 올바른 방법은 무엇을

나는 다음과 같은 방법을 말해? 메소드에 전달되는 EdmCmd 구조체는 일반적으로 명명 된 다양한 회원을 가지고 있기 때문에 나는이 일을하고

Cannot implicitly convert type 'System.Collections.Generic.List<EPDM.Utils.EdmCmdPostAddInfo>' to 'System.Collections.Generic.List<TInfoType>' 

: 나는 오류를 얻고있다. 멤버가 각 CmdType에 대해 나타내는 것을 기억하기가 어렵 기 때문에 좀 더 의미있는 구조체에 래핑합니다.

+0

답변이 아니지만 C# 3.0에서 제네릭이 변하지 않는다고 생각합니다. 컴파일 할 C# 4.0 : http://visualstudiomagazine.com/Articles/2009/05/01/Generic-Covariance-and-Contravariance-in-C-40.aspx?Page=1 –

답변

1

일반 메서드에서 형식을 명시 적으로 참조한다는 사실은 문제가 있음을 나타냅니다. 컴파일러가 List<T>에 해당 유형이 T 인 경우를 제외하고는 어떤 유형의 객체를 포함 할 수 있다는 것을 알 수있는 방법이 없습니다. 잘못된 유형의 메소드를 호출 할 경우

result = new List<T>(); 
foreach (EdmCmdData item in data) 
{ 
    object o = new EdmCmdPostAddInfo(item.mlObjectID1, item.mlObjectID2, item.mbsStrData1, item.mlLongData1) 
    result.Add((T)s); 
} 
return result; 

이것은 런타임에 InvalidCastException가 발생합니다,하지만 당신이 이미 가지고있는 기대해야 문제입니다 :

그래서 이런 식으로 목록을 만들 수 있습니다.

0

나는 당신이하려는 것을보고 있다고 생각하며, C# 3 및 이전 버전에서 원하는 것처럼 실제로 할 수는 없습니다. 이것은 feature of C# 4 though이지만 RTM으로 전환 되려면 몇 개월 기다려야합니다.

+0

그래서 기본적으로 반환하려는 각 유형에 대한 GetInfo() 메소드? 파머. – ehcanadian

+0

또는 기본 형식을 반환 한 다음 호출 함수에서 .OfType () 확장 메서드를 사용하여 원하는 형식을 필터링 할 수 있습니다 (이 방법은 System에 있다고 생각합니다.Linq) –

2

당신은 매개 변수로

TInfoType[] data 

대신

Array data 

의 사용하는 경우, 당신은

List<TInfoType> info = new List<TInfoType>(); 

intead

List<EdmCmdPostAddInfo> info = new List<EdmCmdPostAddInfo>();    
로 사용할 수 있습니다

그리고 나서 새 작업을 수행 할 필요가 없습니다. 대신 데이터로 전달 된 개체 만 사용하십시오. 이것이 출발점이되기를 바랍니다. 새 이씨 엠디 * 구조의 모든 가정

+0

배열에있는 내용을 제어 할 수 없습니다. 이미 EdmCmdData 항목으로 채워져 있습니다. (나는 당신이 말하는 것을 알고 있다고 생각합니다.) – ehcanadian

1
public class Wrapper 
{ 
    public List<TInfoType> GetInfo<TInfoType>(Array data, EdmCmd edmCmd) 
    { 
     List<object> info = new List<object>(); 

     switch (edmCmd.meCmdType) 
     { 
     case EdmCmdType.EdmCmd_PostAdd: 
      foreach (EdmCmdData item in data) 
      { 
      info.Add(new EdmCmdPostAddInfo(item.mlObjectID1, item.mlObjectID2, item.mbsStrData1, item.mlLongData1)); 
      } 
      break;     
     default: 
      break; 
     } 

     return info.OfType<TInfoType>().ToList(); 
    } 
} 

계층 구조와 진정한 구조체가 아닌 클래스, 당신은 객체의 목록을 만들고 배열에 통과 처리 한 후이 캐스팅 할 수 있습니다.

관련 문제