有没有办法在 C# 中实现各种类型的对象列表?IE
GenericCollection genCol = new GenericCollection();
Class1 c1 = new Class1();
Class1 c2 = new Class2();
genCol.Add(c1);
genCol.Add(c2);
我将它与 Unity3D 3(不是 Unity3D 4)一起使用,并且我需要该集合是可序列化的。 这是 Unity 可序列化的描述。
有没有办法在 C# 中实现各种类型的对象列表?IE
GenericCollection genCol = new GenericCollection();
Class1 c1 = new Class1();
Class1 c2 = new Class2();
genCol.Add(c1);
genCol.Add(c2);
我将它与 Unity3D 3(不是 Unity3D 4)一起使用,并且我需要该集合是可序列化的。 这是 Unity 可序列化的描述。
不,Unity 根本不直接支持多态序列化。
您将需要找到不需要此功能的替代设计。为每种类型保留一个单独的列表是一种选择:
class MyStuff
{
public List<Class1> Class1List;
public List<Class2> Class2List;
}
您可以制作一个包装器方法来更轻松地选择类型的列表:
List<Type> GetList<Type>()
{
var type = typeof(Type);
if (type == typeof(Class1))
return Class1List;
else if (type == typeof(Class2))
return Class2List;
else
return null;
}
您可以编写一个迭代器,依次迭代每个项目。这是一个坏主意,因为迭代器的构造会产生垃圾,您应该从在这些平台上制作游戏的经验中努力避免在使用 GCes(Unity、HTML5 等)的游戏中。
我不记得 Unity 的 Mono 版本是否有生成器,但如果有,你可以这样做:
IEnumerable<Object> All()
{
foreach (var i : Class1List)
yield return i;
foreach (var i : Class2List)
yield return i;
}
如果没有生成器,代码会有点难看(您需要维护自己的状态),但可行。您应该能够自己提出该代码。我建议不要在游戏中使用这种方法,因为这是因为垃圾收集器尖峰可能对游戏等软实时应用程序造成的非常现实的问题。