【发布时间】:2010-05-25 16:54:34
【问题描述】:
如何在 wcf 服务中使用泛型方法?
我写了这段代码:
[OperationContract]
void AddItem<T>(T item);
但我收到以下错误:
类型“T”不能导出为模式类型,因为它是开放的泛型类型。如果泛型类型的所有泛型参数类型都是实际类型,则只能导出泛型类型。
【问题讨论】:
如何在 wcf 服务中使用泛型方法?
我写了这段代码:
[OperationContract]
void AddItem<T>(T item);
但我收到以下错误:
类型“T”不能导出为模式类型,因为它是开放的泛型类型。如果泛型类型的所有泛型参数类型都是实际类型,则只能导出泛型类型。
【问题讨论】:
你根本做不到。这是不可能的,因为肥皂不支持这一点。请参阅此article,其中提到了如何通过创建一个中间本地对象来绕过泛型,该对象在调用 WCF 操作之前调用并强制转换该对象。
【讨论】:
您不应该尝试这样做。在启用 SOAP 的 Web 服务中,在发布 WSDL 时需要知道所有类型,以便客户端能够生成代理。 SOAP 规范中根本不存在泛型。 SOAP 旨在实现互操作性,并非所有语言都存在泛型。
【讨论】:
正如所有其他人已经提到的,WCF 和 SOAP 不支持这一点。问题是:您在客户端和服务器之间来回传递的任何内容都必须可以在 XML 模式文档中表达。
XML 模式支持所有常见的原子类型,如字符串、整数、日期时间 - 它支持由这些原子类型组成的复杂类型,并且支持继承。
但是 XML 模式不支持泛型 - 因此,您通过 WCF 和 SOAP 交换的任何内容都不能是泛型的 - 您只需要使用具体的非泛型类型。
我也不知道有什么办法可以解决这个问题。这是一个限制,你现在必须忍受它。
【讨论】:
可以使用数据契约中的有界泛型类型,但必须是服务契约中指定的类型参数,并且作为有效数据契约的指定类型参数
【讨论】:
错误表示不允许打开类型。可能允许的是:
[OperationContract]
void AddItem<T>(T item) where T : MyBaseType;
当然,所有继承的类型都应该加上 KnownType 属性。
【讨论】: