2012-03-12 49 views
2

我有以下的请求和响应数据合同对一个Webservice的方法调用如何在XSD数据合约中指定通用类型参数?

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

回答

1

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

实际上,XSD根本就没有表示泛型类型参数的本地方法。但是,如果你要产生.NET类型了XSD架构,您可以通过装饰型与含有<xsd:appinfo>元素的<xsd:annotation>可以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<string>。请注意,在此示例中,泛型参数被指定为string,但没有任何东西阻止您在具有不同泛型参数的多个合同中重复使用相同的XSD元素定义。

此外,请注意,GenericType元件是XSD标准的一部分,仅通过一个.NET代码生成工具来解释。

+0

好的谢谢。就像在旁边一样,是否可以在XSD中指定你的类是另一个基类型的子类?例如,如果我有一个用Id和Description字段定义的UserChoice对象,那么我可以在XSD类型中声明,例如TravelChoice,SportChoice,FamilyChoice,它们都从UserChoice继承,并且不会添加比基础对象更多的行为? – NZJames 2012-03-12 13:59:36

+0

@JohnSaunders我更新了我的答案。感谢您指出了这一点。 – 2012-03-12 17:26:30

+0

@ user1122909 **是**,您可以用''元素表示继承。看看这个问题的更多细节:http://stackoverflow.com/q/1939062/26396 – 2012-03-12 17:31:05