【问题标题】:How to specify a generic Type parameter in XSD Data Contract?如何在 XSD 数据协定中指定泛型类型参数?
【发布时间】:2012-03-12 11:27:59
【问题描述】:

我有以下用于 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 进行代码生成。

【问题讨论】:

    标签: c# wcf xsd datacontracts wscf


    【解决方案1】:

    很遗憾,不可能在 XSD 中使用开放泛型定义类型。

    实际上,XSD 根本没有表示泛型类型参数的本机方式。但是,如果您要从 XSD 架构中生成 .NET 类型,则可以通过使用包含 &lt;xsd:appinfo&gt; 元素的 &lt;xsd:annotation&gt; 装饰类型来 mimic closed generic arguments

    <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&lt;string&gt; 类型的类。请注意,在此示例中,通用参数指定为 string,但没有什么可以阻止您在具有不同通用参数的多个合同中重用相同的 XSD 元素定义。

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

    【讨论】:

    • 好的,谢谢。顺便说一句,是否可以在 XSD 中指定您的类是另一个基本类型的子类?例如,如果我有一个使用 Id 和 Description 字段定义的 UserChoice 对象,那么我是否可以在 XSD 类型中声明,例如 TravelChoice、SportChoice、FamilyChoice,它们都继承自 UserChoice 并且不添加比基础对象更多的行为?
    • @JohnSaunders 我更新了我的答案。感谢您指出这一点。
    • @user1122909 ,您可以使用&lt;xsd:extension base="MyBaseType" /&gt; 元素来表示继承。查看这个问题了解更多详情:stackoverflow.com/q/1939062/26396
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多