【发布时间】:2009-06-10 16:44:25
【问题描述】:
我有一个类型,我们称之为Data<TKey>。我还有一个 WCF 服务合同,它接受一个类型为 Wrapper 的类型(我们称之为 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 上,因为它不是我的类型。配置似乎是唯一的方法。)
编辑
@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}")]
【问题讨论】:
-
是的,我知道! :) 我编辑了我的答案
标签: .net wcf generics known-types