【问题标题】:Serialize Generic type over WCF Service通过 WCF 服务序列化通用类型
【发布时间】:2012-05-08 14:43:06
【问题描述】:

我有一个 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. 如何实际解决此问题。

我做错了什么?

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    Sleiman 是正确的,但可以使用 this article 中描述的有界泛型,并且您可能能够实现您想要的。这允许您在服务中创建泛型类型并将其公开。但是消费者不会认为它像服务操作中指定的类型那样通用。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        正如 sleiman 所指出的,SOAP 不支持泛型。

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

        相关问题 -> WCF. Service generic methods

        【讨论】:

          【解决方案4】:

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

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

          适用于泛型。

          【讨论】:

          • 这甚至与手头的问题无关。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-28
          • 2012-09-16
          • 2010-12-28
          • 1970-01-01
          • 2011-10-01
          • 1970-01-01
          • 2010-10-30
          相关资源
          最近更新 更多