2009-11-07 104 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) 

什麼是做這種正確的方法是什麼?我得到的錯誤:

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

我這樣做是因爲傳遞給方法的EdmCmd結構具有一般命名爲各個成員。很難記住每個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 – 2009-11-07 23:38:54

回答

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 2009-11-07 21:03:45

+0

或者你可以只返回基類型,然後在調用函數中,使用.OfType ()擴展方法過濾出你想要的類型(我認爲這是在System中。Linq) – 2009-11-07 21:44:12

2

如果您使用,而不是

Array data 

TInfoType[] data 

作爲參數,那麼你可以使用

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

這一翻譯的

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

然後你不需要做新的(而只是使用傳入數據的對象)。 我希望這給你的出發點。

+0

我無法控制陣列中的內容。它已經充滿了EdmCmdData項目。 (我想我知道你在說什麼。) – ehcanadian 2009-11-07 21:20:47

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(); 
    } 
} 

假設所有新ECMD *結構是真正的結構,而不是類具有層次結構,你可以創建對象的列表,並施放此你處理後的陣列傳遞。