Как указать универсальный параметр типа в контракте данных XSD? - PullRequest
2 голосов
/ 12 марта 2012

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

1 голос
/ 12 марта 2012

К сожалению, невозможно определять типы с помощью открытых обобщений в 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.

...