Xsd.exe создает неправильные классы C# при наследовании перечисления

Это ошибка?

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="sbrSexItemType">
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="1"/>
                <xsd:enumeration value="2"/>
                <xsd:enumeration value="3"/>
                <xsd:enumeration value="0"/>
            </xsd:restriction>
    </xsd:simpleType>
    <xsd:element name="TestSexItemType1" type="sbrSexItemType"/>
    <xsd:element name="TestSexItemType2" type="sbrSexItemType"/>
</xsd:schema>

И я получаю:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlRootAttribute("TestSexItemType1", Namespace="", IsNullable=false)]
public enum sbrSexItemType {

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("1")]
    Item1,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("2")]
    Item2,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("3")]
    Item3,

    /// <remarks/>
    [System.Xml.Serialization.XmlEnumAttribute("0")]
    Item0,
}

Это какая-то шутка? Даже ошибку не выдало. Как сгенерированный код представляет XSD в любой форме?


person Sleeper Smith    schedule 22.04.2013    source источник


Ответы (2)


Конечно, возможные значения 1,2,3,0 нельзя напрямую преобразовать в значения перечисления (идентификаторы не могут начинаться с цифры), поэтому xsd помещает «Item» перед значением при создании идентификатора. XmlEnumAttribute сообщает XmlSerializer, какое значение следует фактически использовать при чтении или записи файла Xml. Итак, похоже, что сгенерированное перечисление выполняет свою работу.

person Botz3000    schedule 22.04.2013
comment
Нет, я хочу сказать, что вместо создания типа TestSexItemType1 он генерирует перечисление и указывает корневой элемент, чтобы он выглядел как тип. Затем он полностью игнорирует TestSexItemType2, как будто его не существует?... - person Sleeper Smith; 22.04.2013
comment
@SleeperSmith Должен быть класс для полного xsd. Как это выглядит? - person Botz3000; 22.04.2013
comment
Нет, нет. Это все. - person Sleeper Smith; 22.04.2013

если у вас есть другие типы, а не enum. Вы должны поместить перечисление вверху. Не знаю почему, но моя проблема решилась именно так.

person Anıl Canlı    schedule 22.04.2013
comment
Спасибо за предложение. Я поставил два типа, которые наследуются от перечисления, все равно не повезло. - person Sleeper Smith; 23.04.2013