У меня есть класс запроса баланса торгового счета следующим образом:
[Serializable]
[XmlRoot(ElementName = "accountbalance", Namespace = "", IsNullable = false)]
public class MerchantAccountBalanceRequest
{
[XmlElementAttribute("agent")]
public string Agent { get; set; }
[XmlElementAttribute("agentPin")]
public string AgentPin { get; set; }
}
Это приведет к следующему XML:
<accountbalance>
<agent>aaaaaa</agent>
<agentPin>mmmmmm</agentPin>
</accountbalance>
Могу ли я каким-то образом добавить атрибут в свой класс, чтобы для объекта MerchantAccountBalanceRequest
я получил следующий XML:
<Envelope>
<Body>
<accountbalance>
<agent>aaaaaa</agent>
<agentPin>mmmmmm</agentPin>
</accountbalance>
</Body>
</Envelope>
То есть, просто оберните его элементами Envelope
и Body
.
Пока вы не можете достичь этого с помощью атрибута в своем классе запроса, вы можете обернуть свой запрос в другие классы, представляющие элементы Envelope
и Body
:
public class MerchantAccountBalanceRequest
{
[XmlElement("agent")]
public string Agent { get; set; }
[XmlElement("agentPin")]
public string AgentPin { get; set; }
}
public class RequestBody
{
[XmlElement("accountbalance")]
public MerchantAccountBalanceRequest BalanceRequest { get; set; }
}
[XmlRoot(ElementName = "Envelope")]
public class RequestEnvelope
{
[XmlElement("Body")]
public RequestBody Body { get; set; }
}
При сериализации и десериализации создайте объект XmlSerializer
из RequestEnvelope
вместо MerchantAccountBalanceRequest
. При их создании вам необходимо будет установить свойства RequestEnvelope.Body
и RequestBody.BalanceRequest
(для удобства вы могли бы инициализировать свойство Body
в RequestEnvelope
для нового экземпляра RequestBody
в конструкторе).
Это похоже на один тип запроса в каком-то протоколе, поэтому, если у вас несколько типов запросов, вы можете создать базовый класс для запросов (например, RequestBase
) и настроить RequestBody
так, чтобы он принял выбор возможных элементов запроса, таких как в следующем примере:
public abstract class RequestBase
{
}
public class SomeOtherRequest : RequestBase
{
[XmlElementAttribute("example")]
public string Example { get; set; }
}
public class MerchantAccountBalanceRequest : RequestBase
{
[XmlElement("agent")]
public string Agent { get; set; }
[XmlElement("agentPin")]
public string AgentPin { get; set; }
}
public class RequestBody
{
[XmlElement(ElementName = "accountbalance", Type = typeof(MerchantAccountBalanceRequest))]
[XmlElement(ElementName = "somethingelse", Type = typeof(SomeOtherRequest))]
public RequestBase Request { get; set; }
}