У меня есть тип, назовем его Data<TKey>
. У меня также есть контракт на обслуживание WCF, который принимает тип (давайте назовем его Wrapper
) со свойством типа Object
(по причинам, которые я не буду обсуждать, это не является обязательным).
[DataContract]
public class Data<TKey> { ... }
[DataContract]
public class Wrapper
{
[DataMember]
public object DataItem { get; set; }
}
Прямо сейчас я отправляю два класса IntData
и LongData
:
[DataContract]
public class IntData : Data<int> { /*empty*/ }
[DataContract]
public class LongData : Data<long> { /*empty*/ }
Они оба настроены в файле конфигурации известных типов. Конфиг напоминает что-то вроде этого:
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Wrapper, TheirAssembly">
<knownType type="IntData, MyAssembly"/>
<knownType type="LongData, MyAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>
На данный момент все работает нормально.
Но я собираюсь добавить третий тип, и мне не нравится иметь ненужные, пустые классы .NET IntData
и LongData
. Они существуют только потому, что ...
Я не знаю, как указать универсальные типы в конфигурации WCF!
Я хочу сделать что-то подобное, но не знаю точного синтаксиса.
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Wrapper, TheirAssembly">
<!-- this syntax is wrong -->
<knownType type="Data{System.Int32}, MyAssembly"/>
<knownType type="Data{System.Int64}, MyAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>
Какой правильный синтаксис для этого?
(Обратите внимание, что я не могу поставить [KnownType(...)]
атрибуты на Wrapper
, так как это не мой тип. Кажется, что единственный способ - это Config.)
EDIT
@ Ответ baretta сработал хорошо. Обратите внимание, что изначально я получил эту ошибку:
Тип «MyAssembly.Data`1 [System.Int64]» нельзя добавить в список известных типов, поскольку другой тип «MyAssembly.Data`1 [System.Int32]» с тем же именем контракта данных «http://www.mycompany.com/MyAssembly:Data' уже присутствует.
Я не упомянул об этом в исходном вопросе, но у моего типа есть явное имя контракта данных. Примерно так:
[DataContract(Name = "Data")]
public class Data<TKey> { ... }
Вышеуказанная ошибка происходила до тех пор, пока я не удалил значение свойства Name
из атрибута. Надеюсь, что это поможет кому-то еще. Я не знаю, какой формат работает в этом сценарии. Это не:
[DataContract(Name = "Data\`1")]
[DataContract(Name = "Data{TKey}")]
Кто-нибудь знает, как это сделать?
РЕДАКТИРОВАТЬ 2
Еще раз спасибо @baretta, который указал, что на самом деле правильный синтаксис:
[DataContract(Name = "Data{0}")]