У меня есть типаж, назовем его 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
, поскольку это не мой тип. Конфигурация кажется единственным способом.)
ИЗМЕНИТЬ
Ответ @bartta работал хорошо. Однако обратите внимание, что изначально я получил эту ошибку:
Тип '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}")]