¿Cómo especificar un parámetro de tipo genérico en el contrato de datos XSD?
-
12-12-2019 - |
Pregunta
Tengo la siguiente solicitud y pareja de contratos de datos de respuesta para una llamada de método de servicio 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>
El problema es que lo que quiero tener es una forma de decir (Pseudocódigo)
GetUserResponse response = GetuserOptions(new GetUserOptionsRequest(Type T))
y para que la respuesta contenga un ilista dependiendo de qué tipo paso paso.
Con mi contrato de datos anterior XSD, está esperando una instancia de una clase en el objeto Solicitud, cuando solo quiera especificar una definición de tipo.
Realmente supongo lo que lo quisiera
GetUserResponse<T> response = GetUserOptions(new GetUserOptionsRequest<T>());
Pero no estoy seguro de cómo especificar clases / métodos genéricos en XSD.¿Alguien puede apuntarme en un buen artículo o explicar cómo puedo definir esto en XSD?
Estoy usando el azul WSCF para la generación de código también.
Solución
Desafortunadamente, es no es posible para definir tipos con abre genéricos en XSD.
En realidad, XSD no tiene una forma nativa de representar argumentos de tipo genérico en absoluto. Sin embargo, si va a generar tipos .NET fuera del esquema XSD, puede imita cerrado argumentos genéricos al decorar un tipo con un <xsd:annotation>
que contiene un <xsd:appinfo>
Elemento:
<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>