我有以下Webservice方法调用的请求和响应数据协定对

  <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进行代码生成。

有帮助吗?

解决方案

不幸的是 不可能 定义类型 开放泛型 在XSD中。

实际上,XSD根本没有表示泛型类型参数的本机方式。但是,如果您要生成 .NET类型 出XSD架构,可以 模仿 已关闭 泛型参数 用一个 <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类型系统中表示为类型的类 Foo<string>.请注意,在此示例中,泛型参数指定为 string, ,但没有什么能阻止你 重用 具有不同泛型参数的多个协定中的相同XSD元素定义。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top