Come specificare un parametro tipo generico nel contratto di dati XSD?
-
12-12-2019 - |
Domanda
Ho la seguente coppia di contratto di dati di richiesta e risposta per un metodo WebService Call
<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>
.
Il problema è che ciò che voglio avere è un modo di dire (pseudocodice)
GetUserResponse response = GetuserOptions(new GetUserOptionsRequest(Type T))
.
E per avere la risposta contenente un ilist a seconda del tipo che passa attraverso.
Con il mio contratto di dati sopra riportato XSD, si aspetta un'istanza di una classe nell'oggetto di richiesta, quando voglio solo specificare una definizione di tipo.
Davvero suppongo cosa vorrei vorrei
GetUserResponse<T> response = GetUserOptions(new GetUserOptionsRequest<T>());
.
Ma non sono sicuro di come specificare classi / metodi generici in XSD.Qualcuno può indicarmi un buon articolo o spiegare come posso definirlo in XSD?
Sto usando anche WSCF Blue per la generazione di codice.
Soluzione
Sfortunatamente, è non è possibile per definire i tipi con Generics in XSD.
In realtà, XSD non ha un modo nativo di rappresentare affatto argomenti di tipo Generico. Tuttavia, se si genera tipi .net fuori dallo schema XSD, è possibile mimic chiuso argomenti generici decorando un tipo con un tipo con un <xsd:annotation>
contenente 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>