2

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>

問題は、私が欲しいのは言い方(擬似コード)であるということです

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

また、通過するタイプに応じて、応答にIListが含まれるようにします。

上記のデータコントラクトXSDでは、Type定義を指定するだけの場合、リクエストオブジェクトにクラスのインスタンスが必要です。

本当に私はそれが欲しいと思います

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

しかし、XSDでジェネリッククラス/メソッドを指定する方法がわかりません。誰かが私に良い記事を指摘したり、XSDでこれを定義する方法を説明したりできますか?

コード生成にもWSCFblueを使用しています。

4

1 に答える 1

1

残念ながら、XSDでオープン ジェネリックを使用して型を定義することはできません。

実際、XSD には、ジェネリック型引数を表すネイティブな方法がまったくありません。ただし、XSD スキーマから.NET 型を生成する場合は、要素を含むで型を修飾することにより、クローズドジェネリック引数を模倣できます。<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 型システムで type のクラスとして表されますFoo<string>。この例では、ジェネリック引数が として指定されていますが、ジェネリック引数が異なる複数のコントラクトで同じ XSD 要素定義を再利用stringすることを妨げるものは何もないことに注意してください。

また、GenericType要素はXSD 標準の一部ではなく、.NET コード生成ツールによってのみ解釈されることに注意してください。

于 2012-03-12T12:01:05.040 に答える