WCF。服务通用方法

时间:2010-05-25 16:54:34

标签: c# wcf generics

如何在wcf服务中使用泛型方法?

我写了这段代码:

[OperationContract]
void AddItem<T>(T item);

但是我收到以下错误:

  

类型'T'无法导出为架构类型,因为它是开放的泛型类型。如果所有通用参数类型都是实际类型,则只能导出泛型类型。

5 个答案:

答案 0 :(得分:29)

你根本做不到。这是不可能的,因为肥皂不支持这一点。请参阅此article,其中提到如何绕过泛型,通过创建一个被调用的中间本地对象并在调用WCF操作之前强制转换对象。

答案 1 :(得分:6)

你不应该试图这样做。在启用SOAP的Web服务中,在发布WSDL时需要知道所有类型,以便客户端能够生成代理。泛型只是在SOAP规范中不存在。 SOAP旨在实现互操作,并且所有语言都不存在泛型。

答案 2 :(得分:1)

正如所有其他人已经提到的那样,WCF和SOAP不支持这一点。问题是:在客户端和服务器之间来回传递的任何内容都必须在XML模式文档中表达。

XML模式支持所有常见的原子类型,如string,int,datetime - 它支持由这些原子类型组成的复杂类型,并且它支持继承。

但XML模式不支持泛型 - 因此,您通过WCF和SOAP交换的任何内容都不是通用的 - 您只需要使用具体的非泛型类型。

我也不知道有什么办法。这是一个限制,你现在必须忍受它。

答案 3 :(得分:1)

可以使用数据合同中的有界泛型类型,但必须在服务合同中指定类型参数,并且作为具有有效数据协定的指定类型参数

答案 4 :(得分:0)

错误表明不允许打开类型。可能允许的是:

[OperationContract]
void AddItem<T>(T item) where T : MyBaseType;

当然,所有继承的类型都应该添加KnownType属性。