WCF中的HashSet

时间:2009-05-10 09:19:00

标签: c# wcf hashset proxy-classes service-reference

我在WCF界面中使用HashSet

[ServiceContract]
public interface IwcfServerSync
{
    [OperationContract]
    void Test(HashSet<int> someHashSet);
}

当我创建服务引用时,HashSet变成int []。

我添加了ServiceKnownType:

[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]

并尝试了一些配置,但无法完全改变它。

如果我改变它硬编码一切正常,但每次更新我的参考时更改它真的很烦人。

我可能做错了什么,有什么指示或想法吗?

1 个答案:

答案 0 :(得分:4)

收集过程简化了收集。您可以通过IDE和命令行(svcutil /collectionType)指定集合类型,但它将应用于API上的所有集合。我认为你应该接受它,并通过代码处理不匹配。最后,在线上,集合只是xml(至少在标准绑定上) - 类似于:

<items>
   <item ...>...</item>
   <item ...>...</item>
   <item ...>...</item>
</items>

- 因此它无法告诉(来自架构)数组(T[]),List<T>HashSet<T>MyFunkyCollection<T>。< / p>

请注意,如果您使用程序集共享(即同一服务协定程序集位于客户端服务器),那么这不会发生 - 但这会破坏SOA / mex的意图。但是使用的方法是相当多的 - 因此IDE直接支持它,并通过开关(svcutil /reference)支持命令行。


对于支持它的IDE ...如果你在类库(dll)中编写服务契约和数据契约,然后从这两个库中添加一个程序集引用(即dll引用或项目引用)到这个库项目(服务器项目和客户端项目)。现在,将服务引用从客户端项目添加到服务器端点(.svc)。如果您使用的是VS2008,它将自动检查类型的本地引用并使用它们代替代理生成 - 这意味着:您的客户端代码使用类库中的IwcfServerSync,类库已经知道是否使用{{1}等等。