如何在XSD数据协定中指定泛型类型参数?
-
12-12-2019 - |
题
我有以下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代码生成工具解释。
不隶属于 StackOverflow