Как указать общий параметр типа в контракте данных XSD?
-
12-12-2019 - |
Вопрос
У меня есть следующая пара контрактов данных запроса и ответа для вызова метода веб-сервиса.
<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.