如何在XSD数据协定中指定泛型类型参数

本文关键字:泛型类型参数 数据 XSD | 更新日期: 2023-09-27 18:27:33

我有以下用于调用的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来生成代码。

如何在XSD数据协定中指定泛型类型参数

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

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

<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代码生成工具进行解释。