2012-01-01 25 views
7

Estoy tratando de serializar una lista de descendientes. Esto es lo que tengo ahora, que funciona bien:Xml Serialize List of Descendants

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

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

Esto funciona muy bien y no puede serializar ambos Animal s. Me pregunto si es posible crear una clase Attribute donde pueda pasar la lista de animales (instancias), y crearé para mí los atributos XmlArrayItem.

En general, estoy buscando una manera de evitar especificar los descendientes de Animal cada vez que creo uno nuevo. Quiero que todos los descendientes de Animal sean serializados, cualquiera que sea su tipo.

Respuesta

4

Usted puede obtener una lista de los tipos derivados de un ensamblaje de este modo:

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

Quizás puede desplazarse a través de un bucle foreach en el método GetAllTypesDerivedFrom arriba, y luego encajarlo en una solución similar a la de MSDN ejemplo para XmlArrayItems.

NOTA: Si usted necesita para obtener todos los tipos derivados de una interfaz, podrás lugar es necesario utilizar el siguiente (trabajaría con ambas interfaces y clases):

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