2012-01-01 8 views
7

子孫のリストをシリアル化しようとしています。これは正常に動作している、私が今持っているものです。Xmlは、子孫のリストをシリアライズ

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の属性を作成することができるかと思います。

一般的に、新しいものを作成するたびに、子孫の指定を避ける方法を探しています。AnimalAnimalのすべての子孫を、その型が何であっても直列化したいと思っています。

答えて

4

あなたがそうのようなアセンブリ内の派生型のリストを取得することができます。

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

おそらく、あなたは上記のGetAllTypesDerivedFrom法上のforeachループを一巡することができますし、MSDNと同様のソリューションにそれに合いますXmlArrayItemsの例

注:インターフェイスのすべての派生タイプを取得する必要がある場合は、代わりに以下を使用する必要があります(インタフェースおよびクラスの両方で動作します):

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