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

У меня есть следующая пара контракта данных запроса и ответа для вызова метода 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>

Проблема в том, что я хочу иметь способ сказать (псевдокод)

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

И чтобы ответ содержал IList в зависимости от того, через какой тип я прохожу.

С моим вышеупомянутым контрактом данных XSD, он ожидает экземпляр класса в объекте запроса, когда я просто хочу указать определение типа.

На самом деле я предполагаю, что я хотел бы этого

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

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

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

1 ответ

Решение

К сожалению, в 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.

Другие вопросы по тегам