2

我有以下用于 Web 服务方法调用的请求和响应数据协定对

  <xs:element name="GetUserOptionsRequest">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="OptionType" type="entities:UserOption" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="GetUserOptionsResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Options" type="entities:UserOption" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

问题是我想要的是一种表达方式(伪代码)

GetUserResponse response = GetuserOptions(new GetUserOptionsRequest(Type T))

并根据我通过的类型让响应包含一个 IList。

使用我上面的数据契约 XSD,当我只想指定类型定义时,它期望请求对象中有一个类的实例。

真的我想我想要什么

GetUserResponse<T> response = GetUserOptions(new GetUserOptionsRequest<T>());

但我不确定如何在 XSD 中指定泛型类/方法。谁能指点我一篇好文章或解释我如何在 XSD 中定义它?

我也在使用 WSCF blue 进行代码生成。

4

1 回答 1

1

不幸的是,无法在 XSD中定义具有开放泛型的类型。

实际上,XSD 根本没有表示泛型类型参数的本机方式。但是,如果要从XSD 架构中生成.NET 类型,则可以通过使用包含元素来装饰类型来模仿封闭的泛型参数:<xsd:annotation><xsd:appinfo>

<xs:element name="Foo">
    <xs:complexType>
        <xs:sequence>
            ...
        </xs:sequence>
        <xs:annotation>
            <xs:appinfo>
                <GenericType Name="FooOf{0}{#}"
                             Namespace="...">
                    <GenericParameter Name="string"
                                      Namespace="http://www.w3.org/2001/XMLSchema" />
                </GenericType>
            </xs:appinfo>
        </xs:annotation>
    </xs:complexType> 
</xs:element>

此 XSD 架构将在 .NET 类型系统中表示为 type 的类Foo<string>。请注意,在此示例中,通用参数被指定为string,但没有什么可以阻止您在具有不同通用参数的多个合同中重用相同的 XSD 元素定义。

此外,请注意该GenericType元素不是XSD 标准的一部分,只能由 .NET 代码生成工具解释。

于 2012-03-12T12:01:05.040 回答