Ответ 1
Я не знаю, лучше это или нет, но вы можете попробовать подход DynamicObject
.
http://blogs.msdn.com/b/csharpfaq/archive/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with-dynamicobject.aspx
Я использую XmlSerializer для связи с сервисом. Это не обычный SOAP-сервис, он имеет собственные типы объектов XML. Например, я могу попросить объект <Capabilities>
, но он может вернуть <Exception>
. Итак, другими словами, мне приходится иметь дело со случайными типами документов XML. Однако я знаю, с какими типами я должен иметь дело.
То, что я пытаюсь сделать, это найти общий подход к сериализации/десериализации этих документов. Проблема в том, что XmlSerializer должен знать тип на этапе создания.
Они НЕ заключены в общий корневой элемент, поэтому создание базового класса и использование атрибута [XmlInclude]
НЕ работает в этом случае:
[XmlInclude(typeof(Exception))]
[XmlInclude(typeof(Capabilities))]
public abstract class BaseClass
{
public BaseClass()
{
SchemaLocation = "test";
}
[XmlAttribute("schemaLocation")]
public String SchemaLocation { get; set; }
}
[XmlRoot("Exception")]
public class Exception : BaseClass
{
public Exception():base()
{
}
[XmlElement]
public String Message { set; get; }
}
[XmlRoot("Capabilities")]
public class Capabilities : BaseClass
{
public Capabilities() : base()
{}
[XmlElement]
public String ServiceName { set; get; }
}
Мое решение до сих пор заключается в том, чтобы вручную исследовать корневой элемент с помощью XmlReader, а затем сопоставить его правильному типу перед созданием экземпляра XmlSerializer.
Есть ли лучший способ сделать это?
Я не знаю, лучше это или нет, но вы можете попробовать подход DynamicObject
.
http://blogs.msdn.com/b/csharpfaq/archive/2009/10/19/dynamic-in-c-4-0-creating-wrappers-with-dynamicobject.aspx
Как вы упомянули, когда вы запросите услугу, она может вернуться. Итак, знаете ли вы, был ли запрос создан для типа, тогда служба может вернуть только определенные типы?
Я бы попробовал XmlSerializer Constructor (Тип, Тип [])... Инициализирует новый экземпляр класса XmlSerializer, который может сериализовать объекты указанного типа в XML-документы и десериализовать XML-документы в объект определенного типа. Если свойство или поле возвращает массив, параметр extraTypes указывает объекты, которые могут быть вставлены в массив.