2013-07-15 4 views
1

Есть ли способ реализовать список объектов различных типов в C#? То естьСписок отсортированных классов в C#

GenericCollection genCol = new GenericCollection(); 
Class1 c1 = new Class1(); 
Class1 c2 = new Class2(); 

genCol.Add(c1); 
genCol.Add(c2); 

Я использую это с Unity3D 3 (не Unity3D 4), и мне нужна коллекция быть сериализуемым.Here's a description of Unity serializables.

ответ

1

Нет, 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; 
} 

Без генераторов, код немного уродливее (вам нужно будет поддерживать свой собственный состояние), но выполнимо. Вы должны сами придумать этот код. Я бы рекомендовал против таких подходов в игре, если это должно быть сделано во время игры из-за очень реальных проблем, которые могут возникнуть у шипов сборщика мусора в мягких приложениях реального времени, таких как игры.

Смежные вопросы