我甚至不认为我的问题是正确的,因为我刚开始使用泛型,而且我的知识不是很好。
说我有以下方法:
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 :(得分: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。