Создайте документы XML, используя наследование - PullRequest
3 голосов
/ 19 марта 2012

Я хотел бы иметь базовый класс, который реализует большую часть этого примера, и наследовать для частей, которые отличаются.Все сообщения одинаковы, за исключением узла сообщений, который может сильно отличаться.Кто-нибудь знает, как это сделать?

[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>

Ответы [ 3 ]

1 голос
/ 19 марта 2012

Спасибо 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; }
}
1 голос
/ 19 марта 2012

Если у вас есть класс

public class Message { }

затем вы можете создавать новые типы сообщений, наследуя их (конечно, вы знаете эту часть):

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

Теперь, если вы хотите иметь возможность назначать экземпляры этих классов вашему свойству Package.Message и хотите, чтобы они были правильно сериализованы, вы должны включить эти унаследованные типы через атрибуты:

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

Полученный Xml будет выглядеть несколько иначе, но он имеет то же значение:

<Message d3p1:type="Request" xmlns:d3p1="http://www.w3.org/2001/XMLSchema-instance">
...
</Message>
0 голосов
/ 20 марта 2012

Как оказалось, после добавления дополнительных свойств к моим классам сообщений, сериализация стала неправильно сериализовывать 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...