如何返回通用列表?

时间:2009-11-07 20:19:36

标签: c# generics

我甚至不认为我的问题是正确的,因为我刚开始使用泛型,而且我的知识不是很好。

说我有以下方法:

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代表什么,所以我将它们包装在一个更有意义的结构中。

4 个答案:

答案 0 :(得分:2)

如果您使用

TInfoType[] data

而不是

Array data

作为参数,则可以使用

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

intead of

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

然后您不需要执行新操作(而只需使用传入数据的对象)。 我希望这能为你提供起点。

答案 1 :(得分: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 *结构都是真正的结构而不是具有层次结构的类,您可以创建一个对象列表,并在处理完传入的数组后对其进行强制转换。

答案 2 :(得分: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,但这是您应该已经预料到的问题。

答案 3 :(得分:0)

我想我已经看到了你想要做的事情,并且不可能像C#3和之前的版本那样去做。这是一个feature of C# 4 though,但您必须等待几个月才能进行RTM。