Как инициализировать тип, оформленный с помощью System.Xml.Serialization.XmlElementAttribute (String, Type) - PullRequest
3 голосов
/ 26 октября 2011

Я работаю над веб-сервисом RESTful с веб-API WCF. Другая сторона предоставила файлы XSD. Я сгенерировал классы C # с помощью xsd.exe. Однако схема содержит один сложный тип, с которым у меня проблема:

<xs:complexType name="SearchableField">
    <xs:choice>
        <xs:element name="NumericValue" type="xs:float" minOccurs="1" maxOccurs="1"/>
        <xs:element name="BooleanValue" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
    </xs:choice>
    <xs:attribute name="type" type="SearchableFieldType" use="required"/>
</xs:complexType>

Это сгенерированный код для сложного типа:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SearchableField {

    private object itemField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("BooleanValue", typeof(bool), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [System.Xml.Serialization.XmlElementAttribute("NumericValue", typeof(float), Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public object Item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type {
        get {
            return this.typeField;
        }
        set {
            this.typeField = value;
        }
    }
}

Вопрос: Как инициализировать свойство Item типа - это простой объект - чтобы его можно было сериализовать в соответствии со схемой.

Ограничение: Схема уже указана, поэтому я не могу изменить файл XSD.

Вот пример элемента XML, как он должен выглядеть:

<SearchableFields>
    <SearchableField type="MEGAPIXELS">
        <NumericValue>12</NumericValue>
    </SearchableField>
    <SearchableField type="WEATHER_RESISTANT">
        <BooleanValue>true</BooleanValue>
    </SearchableField>
    <SearchableField type="WATER_RESISTANT">
        <BooleanValue>false</BooleanValue>
    </SearchableField>
</SearchableFields>

1 Ответ

2 голосов
/ 26 октября 2011

(комментарии)

Когда я пытаюсь сделать это таким образом, он не может быть сериализован:

var field = new SearchableField { type = "monitor_size", Item = 5 };

Действительно - NumericValue объявлен как float в xml / C #, и использование int собирается ввести недопустимое приведение;это работает, однако:

var field = new SearchableField { type = "monitor_size", Item = 5F };

с выводом:

<SearchableField type="monitor_size">
  <NumericValue>5</NumericValue>
</SearchableField>
...