我有一个 C# 类,定义如下:
public class GenericItem<T>
{
public List<T> Items { get; set; }
public DateTime TimeStamp { get; set; }
}
我正在我的服务器上创建此类的实例。然后我尝试通过 WCF 服务通过网络传递它,如下所示:
[OperationContract]
public GenericItem<MyCustomType> GetResult()
{
GenericItem<MyCustomType> result = BuildGenericItem();
return result;
}
此时一切都编译得很好。当我在 Silverlight 应用程序中“更新服务引用”重新编译时,我收到一个编译时错误,类似于以下内容:
MyNamespace.GenericItemOfMyCustomType[extra chars] 不包含“GetEnumerator”的公共定义
我不知道为什么:
我做错了什么?
Sleiman 是正确的,但是可以按照本文中所述对类型参数使用有界泛型/约束,并且您也许能够实现您想要的。这允许您在服务中创建通用类型并公开它。但消费者不会将其视为通用的,因为类型是在服务操作中指定的。
您无法定义依赖于泛型类型参数的 WCF 合约。泛型是 特定于 .NET,使用它们会违反 WCF 面向服务的本质。但是,数据协定可以包含集合作为数据成员,因为 WCF 为集合提供了专用的封送规则。
正如 sleiman 所指出的,SOAP 不支持泛型。
WCF 和泛型 -> http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/79585667-6b97-4ce4-93fa-3a4dcc7a9b86
相关问题 -> WCF。服务通用方法
您可以在客户端使用以下内容,而不是使用服务引用:
var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("");
var myChannelFactory = new ChannelFactory<IService>(myBinding, myEndpoint);
IService gks = myChannelFactory.CreateChannel();
适用于仿制药。