使用xsd在扩展complexType中初始化Enum

时间:2014-12-29 14:48:59

标签: c# enums xsd initialization abstract-class

<xs:simpleType name="Gender">
    <xs:restriction base="xs:string">
        <xs:enumeration value="Male"/>
        <xs:enumeration value="Female"/>
    </xs:restriction>
</xs:simpleType>

<xs:complexType name="Client"
                abstract="true">
    <xs:attribute name="LastName"
                  type="xs:string"
                  use="optional"/>
    <xs:attribute name="FirstName"
                  type="xs:string"
                  use="optional"/>
    <xs:attribute name="Gender"
                  type="Gender"
                  use="required"/>
</xs:complexType>

<xs:complexType name="MaleClient">
    <xs:complexContent>
        <xs:extension base="Client">
            <xs:attribute name="Gender"
                          type="Gender"
                          use="required"
                          fixed="Male"/>
            <xs:attribute name="NewMaleProperty"
                          type="xs:string"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="FemaleClient">
    <xs:complexContent>
        <xs:extension base="Client">
            <xs:attribute name="Gender"
                          type="Gender"
                          use="required"
                          fixed="Female"/>
            <xs:attribute name="NewFemaleProperty"
                          type="xs:string"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

我有一个抽象类(Client),我将该类扩展为两个子类(MaleClient和FemaleClient)。

当我使用当前架构生成我的类时,会生成一个名为“Gender1”的新属性。 我想做的是将MaleClient和FemaleClient的性别初始化为各自的值。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您当前的定义是尝试在一个步骤中组合限制(在Gender属性上)和扩展名(添加新属性)。

表示,这不仅会产生您在绑定工具中不喜欢的结果,而且会使模式不符合。

如果将两个更改分成两个派生步骤,会发生什么?

<xs:complexType name="MaleClient-0">
  <xs:complexContent>
    <xs:restriction base="Client">
      <xs:attribute name="Gender"
        type="Gender"
        use="required"
        fixed="Male"/>
    </xs:restriction>      
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="MaleClient">
  <xs:complexContent>
    <xs:extension base="MaleClient-0">
      <xs:attribute name="NewMaleProperty"
        type="xs:string"/>
    </xs:extension>      
  </xs:complexContent>
</xs:complexType>

将中间类型设为匿名是很好的,但这似乎是不可能的(XSD表面语法中的另一个缺陷)。