2012-03-19 14 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; } 
} 
関連する問題