Question

J'ai la paire de contrats de données de demande et de réponse suivante pour un appel de méthode de service 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>

Le problème est que ce que je veux, c'est une façon de dire (pseudocode)

GetUserResponse response = GetuserOptions(new GetUserOptionsRequest(Type T))

Et pour que la réponse contienne une IList en fonction du type que je traverse.

Avec mon contrat de données XSD ci-dessus, il attend une instance d'une classe dans l'objet de requête, alors que je souhaite simplement spécifier une définition de type.

Vraiment, je suppose que ce que je voudrais

GetUserResponse<T> response = GetUserOptions(new GetUserOptionsRequest<T>());

Mais je ne sais pas comment spécifier des classes/méthodes génériques dans XSD.Quelqu'un peut-il m'indiquer un bon article ou expliquer comment je peux définir cela dans XSD ?

J'utilise également WSCF blue pour la génération de code.

Était-ce utile?

La solution

Malheureusement, c'est pas possible pour définir des types avec génériques ouverts en XSD.

En fait, XSD ne dispose pas du tout de manière native de représenter les arguments de type générique.Cependant, si vous souhaitez générer Types .NET hors du schéma XSD, vous pouvez imiter fermé arguments génériques en décorant un type avec un <xsd:annotation> contenant un <xsd:appinfo> élément:

<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>

Ce schéma XSD sera représenté dans le système de types .NET comme une classe de type Foo<string>.Notez que dans cet exemple, l'argument générique est spécifié comme string, mais rien ne vous empêche réutiliser la même définition d'élément XSD dans plusieurs contrats avec différents arguments génériques.

Notez également que le GenericType l'élément est pas fait partie du standard XSD et ne sera interprété que par un outil de génération de code .NET.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top