Как указать общий параметр типа в контракте данных XSD?

StackOverflow https://stackoverflow.com//questions/9666195

Вопрос

У меня есть следующая пара контрактов данных запроса и ответа для вызова метода веб-сервиса.

  <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 ожидается экземпляр класса в объекте запроса, когда я просто хочу указать определение типа.

На самом деле я думаю, чего бы мне хотелось.

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

Но я не уверен, как указать общие классы/методы в XSD.Может ли кто-нибудь указать мне на хорошую статью или объяснить, как я могу определить это в XSD?

Я также использую синий WSCF для генерации кода.

Это было полезно?

Решение

К сожалению, это невозможно определять типы с помощью открытые дженерики в XSD.

На самом деле, XSD вообще не имеет собственного способа представления аргументов универсального типа.Однако, если вы собираетесь генерировать .NET-типы из схемы XSD вы можете имитировать закрыто общие аргументы украсив шрифт значком <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 как класс типа Foo<string>.Обратите внимание, что в этом примере общий аргумент указан как string, но ничто не мешает вам повторное использование одно и то же определение элемента XSD в нескольких контрактах с разными общими аргументами.

Также обратите внимание, что GenericType элемент нет часть стандарта XSD и будет интерпретироваться только инструментом генерации кода .NET.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top