通过WCF服务序列化通用类型

时间:2012-05-08 14:43:06

标签: c# wcf

我有一个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'的公共定义

我不明白为什么:

  1. 出现额外的字符。每次我更新服务参考时似乎都会改变。
  2. 如何实际解决此问题。
  3. 我做错了什么?

4 个答案:

答案 0 :(得分:9)

Sleiman是正确的,但是可以使用this article中描述的Bounded Generics,你可以实现你想要的。这允许您在服务中创建泛型类型并公开它。但是,消费者不会将其视为通用,因为在服务操作中指定了类型。

答案 1 :(得分:5)

您无法定义依赖于泛型类型参数的WCF合约。泛型是 特定于.NET,并使用它们将违反WCF的面向服务的性质。但是,数据协定可以包含集合作为数据成员,因为WCF为集合提供了专用的编组规则。

答案 2 :(得分:1)

正如sleiman指出的那样,SOAP中不支持泛型。

WCF和泛型 - &gt; http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/79585667-6b97-4ce4-93fa-3a4dcc7a9b86

相关问题 - &gt; WCF. Service generic methods

答案 3 :(得分:-4)

您可以在客户端使用以下内容,而不是使用服务引用:

var myBinding = new BasicHttpBinding();
var myEndpoint = new EndpointAddress("");
var myChannelFactory = new ChannelFactory<IService>(myBinding, myEndpoint);
IService gks = myChannelFactory.CreateChannel();

适用于泛型。