Pergunta

Eu tenho o seguinte par de contratos de dados de solicitação e resposta para uma chamada de método Webservice

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

O problema é que o que eu quero é uma forma de dizer (pseudocódigo)

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

E fazer com que a resposta contenha um IList dependendo do tipo pelo qual passo.

Com meu contrato de dados XSD acima, ele espera uma instância de uma classe no objeto de solicitação, quando desejo apenas especificar uma definição de tipo.

Realmente, suponho que o que eu iria querer

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

Mas não tenho certeza de como especificar classes/métodos genéricos no XSD.Alguém pode me indicar um bom artigo ou explicar como posso definir isso no XSD?

Também estou usando o WSCF blue para geração de código.

Foi útil?

Solução

Infelizmente, é não é possivel para definir tipos com genéricos abertos em XSD.

Na verdade, o XSD não possui uma maneira nativa de representar argumentos de tipo genérico.No entanto, se você pretende gerar Tipos .NET fora do esquema XSD, você pode mímico fechado argumentos genéricos decorando um tipo com um <xsd:annotation> contendo um <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>

Este esquema XSD será representado no sistema de tipos .NET como uma classe do tipo Foo<string>.Observe que neste exemplo o argumento genérico é especificado como string, mas nada impede você de reutilizando a mesma definição de elemento XSD em vários contratos com diferentes argumentos genéricos.

Além disso, observe que GenericType elemento é não parte do padrão XSD e só será interpretado por uma ferramenta de geração de código .NET.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top