我正在使用来自 wsdl 的 Visual Studio 2010 生成 C# 服务引用。(简化示例,请原谅任何语法错误):
<xs:complexType name="Constraints">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="unbounded" ref="p:Constraint" />
</xs:sequence>
</xs:complexType>
<xs:element name="Constraint" type="p:ConstraintType" />
<xs:complexType abstract="true" name="ConstraintType />
<xs:complexType name="RelConstraint" >
<xs:complexContent>
<xs:extension base="p:ConstraintType">
...
</xs:extension>
<xs:complexContent>
</xs:complexType>
<xs:complexType name="Logic" abstract="true">
<xs:complexContent>
<xs:extension base="p:ConstraintType">
...
</xs:extension>
<xs:complexContent>
</xs:complexType>
<xs:complexType name="AndLogic" >
<xs:complexContent>
<xs:extension base="p:Logic">
...
</xs:extension>
<xs:complexContent>
</xs:complexType>
Constraints 的元素是 .Item 而不是 .Constraint (这很好,我知道这发生在抽象中)。
但是, Constraints.Item 类型是 RelConstraint 而不是 ConstraintType,因此它不会将 AndLogic 识别为可能的类型。
因此,如果一种具体类型被抽象一层,另一种被抽象两层,那么服务引用设置对只抽象一层的类的任何引用。
(例如,ConcreteClassA 扩展了 AbstractClassC,ConcreteClassB 扩展了 AbstractClassB,AbstractClassB 扩展了 AbstractClassC,
ConcreteClassX 有元素 AbstractClassC,它应该是那种类型。但是,该元素的类型为 ConcreteClassA)
有解决办法吗?