Frage

Ich habe das folgende Anforderungs- und Antwortdatenvertragspaar für einen Webservice-Methodenaufruf

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

Das Problem ist, dass das, was ich haben möchte, eine Art zu sagen ist (Pseudocode)

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

Und damit die Antwort eine IList enthält, abhängig davon, welchen Typ ich durchlaufe.

Mit meinem obigen Datenvertrag XSD erwartet es eine Instanz einer Klasse im Anforderungsobjekt, wenn ich nur eine Typdefinition angeben möchte.

Wirklich, ich nehme an, was ich wollen würde

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

Ich bin mir jedoch nicht sicher, wie ich generische Klassen / Methoden in XSD angeben soll.Kann mir jemand einen guten Artikel zeigen oder erklären, wie ich das in XSD definieren kann?

Ich verwende WSCF Blue auch für die Codegenerierung.

War es hilfreich?

Lösung

Leider ist es nicht möglich typen definieren mit offene Generika im XSD-Format.

Tatsächlich hat XSD überhaupt keine native Möglichkeit, generische Typargumente darzustellen.Wenn Sie jedoch generieren werden .NET-Typen aus dem XSD-Schema können Sie imitieren geschlossen generische Argumente durch Dekorieren eines Typs mit einem <xsd:annotation> enthält eine <xsd:appinfo> Element:

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

Dieses XSD-Schema wird im .NET-Typsystem als Klasse des Typs dargestellt Foo<string>.Beachten Sie, dass in diesem Beispiel das generische Argument wie folgt angegeben ist string, aber nichts hindert Sie daran wiederverwendet dieselbe XSD-Elementdefinition in mehreren Verträgen mit unterschiedlichen generischen Argumenten.

Beachten Sie auch, dass die GenericType element ist nicht teil des XSD-Standards und wird nur von einem .NET-Codegenerierungstool interpretiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top