为什么我的 WSDL 中基于零的索引缺少枚举值注释
Why are Enumeration Value annotations missing for Zero based indexes in my WSDL
我的 WFC 项目 WSDL 缺少基于零的索引的 EnumerationValue 注释。如果说 JSON 为支付方式传入 0 或 1,就会在转换期间给其他系统带来问题。
我已经这样定义了我的 .net class 的枚举:
[DataContract(Name = "PaymentMethod")]
public enum PaymentMethod
{
[EnumMember]
Mastercard = 0,
[EnumMember]
Visa = 1
}
[DataContract(Name = "RequestType")]
public enum RequestType
{
[EnumMember]
New = 1,
[EnumMember]
Reload = 2
}
但是生成的 WSDL 看起来像这样:
<xs:simpleType name="PaymentMethod">
<xs:restriction base="xs:string">
<xs:enumeration value="Mastercard"/>
<xs:enumeration value="Visa"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="PaymentMethod" nillable="true" type="tns:PaymentMethod"/>
<xs:simpleType name="RequestType">
<xs:restriction base="xs:string">
<xs:enumeration value="New">
<xs:annotation>
<xs:appinfo>
<EnumerationValue>1</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="Reload">
<xs:annotation>
<xs:appinfo>
<EnumerationValue>2</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:element name="RequestType" nillable="true" type="tns:RequestType"/>
要包含在数据协定中,您必须应用 EnumMemberAttribute 属性。在 .NET Framework 中,您始终可以将特殊值 0(零)应用于枚举,这也是任何枚举的默认值。 但是,即使是这个特殊的零值也不能序列化,除非用 EnumMemberAttribute 属性标记它。
这有两个例外:
- Flag enumerations.
EmitDefaultValue 属性 设置为 false 的枚举数据成员(在这种情况下,从序列化中省略值为零的枚举数据)。
[DataContract(Name = "PaymentMethod")]
[Flags] // <---- Try this
public enum PaymentMethod
{
[EnumMember]
Mastercard = 0,
[EnumMember]
Visa = 1
}
[DataContract(Name = "RequestType")]
public enum RequestType
{
[EnumMember]
New = 1,
[EnumMember]
Reload = 2
}
我的 WFC 项目 WSDL 缺少基于零的索引的 EnumerationValue 注释。如果说 JSON 为支付方式传入 0 或 1,就会在转换期间给其他系统带来问题。
我已经这样定义了我的 .net class 的枚举:
[DataContract(Name = "PaymentMethod")]
public enum PaymentMethod
{
[EnumMember]
Mastercard = 0,
[EnumMember]
Visa = 1
}
[DataContract(Name = "RequestType")]
public enum RequestType
{
[EnumMember]
New = 1,
[EnumMember]
Reload = 2
}
但是生成的 WSDL 看起来像这样:
<xs:simpleType name="PaymentMethod">
<xs:restriction base="xs:string">
<xs:enumeration value="Mastercard"/>
<xs:enumeration value="Visa"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="PaymentMethod" nillable="true" type="tns:PaymentMethod"/>
<xs:simpleType name="RequestType">
<xs:restriction base="xs:string">
<xs:enumeration value="New">
<xs:annotation>
<xs:appinfo>
<EnumerationValue>1</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="Reload">
<xs:annotation>
<xs:appinfo>
<EnumerationValue>2</EnumerationValue>
</xs:appinfo>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:element name="RequestType" nillable="true" type="tns:RequestType"/>
要包含在数据协定中,您必须应用 EnumMemberAttribute 属性。在 .NET Framework 中,您始终可以将特殊值 0(零)应用于枚举,这也是任何枚举的默认值。 但是,即使是这个特殊的零值也不能序列化,除非用 EnumMemberAttribute 属性标记它。
这有两个例外:
- Flag enumerations.
EmitDefaultValue 属性 设置为 false 的枚举数据成员(在这种情况下,从序列化中省略值为零的枚举数据)。
[DataContract(Name = "PaymentMethod")] [Flags] // <---- Try this public enum PaymentMethod { [EnumMember] Mastercard = 0, [EnumMember] Visa = 1 } [DataContract(Name = "RequestType")] public enum RequestType { [EnumMember] New = 1, [EnumMember] Reload = 2 }