2012-03-19 85 views
3

我想要一個基類來實現這個例子的大部分,並且繼承不同的部分。除了消息節點之外,所有消息都是相同的,這可能會非常不同。有人知道怎麼做嗎?使用繼承來創建Xml文檔

[XmlRoot("Package")] 
public class Package 
{ 
    [XmlElement("Parameters")] 
    public parameters Parameters; 
    public class parameters 
    { 
     [XmlElement("MessageType")] 
     public string MessageType { get; set; } 

     [XmlElement("CreationDateTime")] 
     public string CreationDateTime { get; set; } 

     //etc... 
    } 

    [XmlElement("Message")] 
    public message Message; 
    public class message 
    { 
     // here I want different message types 
     // hopefully through inheritance 
    } 
} 

例如,我想這有時...

<Package> 
    <Parameters> 
     <MessageType></MessageType> 
     <CreationDateTime></CreationDateTime> 
     <MessageId></MessageId> 
    </Parameters> 
    <Message> 
     <MessageTypeRequest> 
      <etc1></etc1> 
      <etc2></etc2> 
     </MessageTypeRequest> 
    </Message> 
</Package> 

...但我想這在其他時間。

<Package> 
    <Parameters> 
     <MessageType></MessageType> 
     <CreationDateTime></CreationDateTime> 
     <MessageId></MessageId> 
    </Parameters> 
    <Message> 
     <MessageTypeResponse> 
      <etc1></etc1> 
      <etc2></etc2> 
     </MessageTypeResponse> 
    </Message> 
</Package> 

回答

1

如果你有一個類

public class Message { }

那麼你可以從他們那裏繼承創建新的消息類型(當然你知道的那部分):

public class Request : Message { ... } 
public class Response : Message { ... } 

現在,如果您希望能夠將這些類的實例分配給您的屬性Package.Message並希望它們正確地序列化,您必須通過一個包含這些繼承的類型ttributes:

[XmlInclude(typeof(Request))] 
[XmlInclude(typeof(Response))] 
public class Package { ... } 

生成的XML看起來有些不同,但具有相同的含義:

<Message d3p1:type="Request" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance"> 
... 
</Message> 
1

謝謝Botz3000的回覆,你的提示幫助。

我正在與此,它會產生確切的結果。雖然我寧願基類不知道使用它的類。下面的代碼:

[XmlRoot("Package")] 
public class Package 
{ 
    public Package() { } 
    public Package(MessageTypeRequest req) 
    { 
     Message = new message(); 
     Message.requestMessage = req; 
    } 
    public Package(MessageTypeResponse resp) 
    { 
     Message = new message(); 
     Message.responseMessage = resp; 
    } 

    [XmlElement("Parameters")] 
    public parameters Parameters; 
    public class parameters 
    { 
     [XmlElement("MessageType")] 
     public string MessageType { get; set; } 

     [XmlElement("CreationDateTime")] 
     public string CreationDateTime { get; set; } 
    } 

    [XmlElement("Message")] 
    public message Message; 
    public class message 
    { 
     [XmlElement("MessageTypeRequest")] 
     public MessageTypeRequest requestMessage { get; set; } 

     [XmlElement("MessageTypeResponse")] 
     public MessageTypeResponse responseMessage { get; set; } 
    } 
} 

public class MessageTypeRequest : Package 
{ 
    public MessageTypeRequest() 
    { 
     etc1 = "A simple request."; 
     etc2 = "test 2"; 
    } 

    [XmlElement("etc1")] 
    public string etc1 { get; set; } 

    [XmlElement("etc2")] 
    public string etc2 { get; set; } 
} 

public class MessageTypeResponse : Package 
{ 
    public MessageTypeResponse() 
    { 
     etc1 = "My simple response"; 
     etc2 = "test 2"; 
    } 

    [XmlElement("etc1")] 
    public string etc1 { get; set; } 

    [XmlElement("etc2")] 
    public string etc2 { get; set; } 
} 
0

事實證明,增加更多的屬性,以我的消息類之後,序列化開始連載的XML文件錯誤地包括在派生類中的基類的項目,以及...這個是什麼修復了這個問題:

[XmlRoot("Package")] 
public class Package 
{ 
    public Package() { } 
    public Package(MessageContent messageContent) 
    { 
     Message = new message(); 
     Message.messageContent = messageContent; 
    } 

    [XmlElement("Parameters")] 
    public parameters Parameters; 
    public class parameters 
    { 
     [XmlElement("MessageType")] 
     public string MessageType { get; set; } 

     [XmlElement("CreationDateTime")] 
     public string CreationDateTime { get; set; } 
    } 

    [XmlElement("Message")] 
    public message Message; 
    public class message 
    { 
     [XmlElement(Type = typeof(MessageTypeRequest)), XmlElement(Type = typeof(MessageTypeResponse))] 
     public MessageContent messageContent { get; set; } 
    } 
} 

public class MessageContent { } 

public class MessageTypeRequest : MessageContent 
{ 
    public MessageTypeRequest() 
    { 
     etc1 = "A simple request."; 
     etc2 = "test 2"; 
    } 

    public static Package MessageRequest() 
    { 
     return new Package(new MessageTypeRequest()); 
    } 

    [XmlElement("etc1")] 
    public string etc1 { get; set; } 

    [XmlElement("etc2")] 
    public string etc2 { get; set; } 
} 

public class MessageTypeResponse : MessageContent 
{ 
    public MessageTypeResponse() 
    { 
     etc1 = "My simple response"; 
     etc2 = "test 2"; 
    } 

    public static Package MessageRequest() 
    { 
     return new Package(new MessageTypeResponse()); 
    } 

    [XmlElement("etc1")] 
    public string etc1 { get; set; } 

    [XmlElement("etc2")] 
    public string etc2 { get; set; } 
}