2012-01-01 22 views
7

Sto provando a serializzare un elenco di discendenti. Questo è quello che ho adesso, che funziona benissimo:Xml Serializza Elenco dei discendenti

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

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

Questo funziona bene e posso serializzare entrambe Animal s. Mi chiedo se sia possibile creare una classe Attribute in cui posso passare l'elenco di animali (istanze) e creerò per me gli attributi XmlArrayItem s.

In generale, sto cercando un modo per evitare di specificare i discendenti di Animal ogni volta che ne creo uno nuovo. Voglio che tutti i discendenti di Animal siano serializzati, indipendentemente dal loro tipo.

risposta

4

È possibile ottenere un elenco dei tipi di derivati ​​in un assieme in questo modo:

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

Forse si può passare da un ciclo foreach sul metodo GetAllTypesDerivedFrom sopra, e poi inserirla in una soluzione simile alla MSDN esempio per XmlArrayItems.

NOTA: Se avete bisogno di ottenere tutti i tipi derivati ​​per un'interfaccia, sarà invece necessario utilizzare il seguente (avrebbe lavorato con entrambe le interfacce e classi):

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