我有一个类型,我们称之为Data<TKey>
。Wrapper
我还有一个 WCF 服务合同,它接受具有类型属性的类型(让我们称之为) 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
因为它不是我的类型。配置似乎是唯一的方法。)
编辑
@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}")]