代码之家  ›  专栏  ›  技术社区  ›  ehcanadian

如何返回通用列表?

  •  2
  • ehcanadian  · 技术社区  · 15 年前

    我甚至不认为我的问题是正确的,因为我只是从泛型开始,我的知识不是很好。

    假设我有以下方法:

    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 回复  |  直到 15 年前
        1
  •  2
  •   Nestor    15 年前

    如果你使用

    TInfoType[] data
    

    而不是

    Array data
    

    作为参数,则可以使用

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

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

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

        2
  •  1
  •   Brett    15 年前
    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*结构都是真正的结构,而不是具有层次结构的类,则可以创建一个对象列表,并在处理传入的数组后进行转换。

        3
  •  1
  •   Robert Rossney    15 年前

    在泛型方法中显式引用类型的事实表明您遇到了问题。编译器不可能知道 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 在运行时,如果您使用错误的类型调用该方法,但这是您应该已经预料到的问题。

        4
  •  0
  •   Dave Markle    15 年前

    我想我明白了你想做什么,但在C#3和之前的版本中,你不可能像你想的那样去做。这是一个 feature of C# 4 though ,但您必须等待几个月才能使用RTM。