2012-02-12 52 views

回答

4

通常使用具有多个派生类型的抽象类来允许使用强类型列表等。

例如,您可能有一个DocumentFragment类,它是抽象的和两个名为TextDocumentFragment和CommentDocumentFragment的具体类(此示例来自Willis)。

这允许创建一个List属性,它只能包含这两种类型的对象。

如果试图创建一个返回该列表中你会得到一个错误一个WebService,但是这是很容易用下面的代码来解决....

[Serializable()] 
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))] 
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))] 
public abstract class DocumentFragment { 
...} 

的XmlInclude属性告诉类,它可能被序列化为这两个派生类。

这将在DocumentFragment元素中生成一个指定实际类型的属性,如下所示。

<DocumentFragment xsi:type="TextDocumentFragment"> 

使用此方法还将包含特定于派生类的任何附加属性。

11

另一种方法是使用XmlElementAttribute移动已知类型的泛型列表本身的列表...

using System; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Collections.Generic; 

public abstract class Animal 
{ 
    public int Weight { get; set; }  
} 

public class Cat : Animal 
{ 
    public int FurLength { get; set; }  
} 

public class Fish : Animal 
{ 
    public int ScalesCount { get; set; }  
} 

public class AnimalFarm 
{ 
    [XmlElement(typeof(Cat))] 
    [XmlElement(typeof(Fish))] 
    public List<Animal> Animals { get; set; } 

    public AnimalFarm() 
    { 
     Animals = new List<Animal>(); 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     AnimalFarm animalFarm = new AnimalFarm(); 
     animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 }); 
     animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 }); 
     XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm)); 
     serializer.Serialize(Console.Out, animalFarm); 
    } 
} 

...这也将导致一个更好看的XML输出(不难看xsi:type属性)...

<?xml version="1.0" encoding="ibm850"?> 
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Cat> 
    <Weight>4000</Weight> 
    <FurLength>3</FurLength> 
    </Cat> 
    <Fish> 
    <Weight>200</Weight> 
    <ScalesCount>99</ScalesCount> 
    </Fish> 
</AnimalFarm> 
+0

如果你不想保留Animals元素,你可以使用XmlArrayItemAttribute来代替。 – Console 2014-11-10 09:14:19