Сериализация XML списка потомков - PullRequest
7 голосов
/ 01 января 2012

Я пытаюсь сериализовать список потомков.Это то, что у меня сейчас, и это прекрасно работает:

class Animal {}
class Zebra:Animal{}
class Hippo:Animal{}

[XmlRootAttribute("Zoo")] 
class Zoo
{
    [XmlArrayItem(typeof(Zebra))]
    [XmlArrayItem(typeof(Hippo))]
    public List<Animal> Actions
    { set; get; }
}

Это отлично работает, и я могу сериализовать оба Animal s.Интересно, можно ли создать класс Attribute, в котором я могу передать список животных (экземпляров) и создать для меня атрибуты XmlArrayItem s.

В общем, я ищуспособ избежать указания потомков Animal каждый раз, когда я создаю новый.Я хочу, чтобы все потомки Animal были сериализованы, независимо от их типа.

1 Ответ

4 голосов
/ 01 января 2012

Вы можете получить список производных типов в сборке, например, так:

public IEnumerable<Type> GetAllTypesDerivedFrom(Type type)
{
    var types = Assembly.GetAssembly(type).GetTypes();
    return types.Where(t => t.IsSubclassOf(type));
}

Возможно, вы можете циклически пройти цикл foreach в приведенном выше методе GetAllTypesDerivedFrom, а затем встроить его в решение, аналогичноеПример MSDN для XmlArrayItems .

ПРИМЕЧАНИЕ. Если вам нужно получить все производные типы для интерфейса, вам вместо этого потребуется использовать следующее (будет работать как с интерфейсами, так и склассы):

return types.Where(type.IsAssignableFrom).Where(t => t != type);
...