在WCF客户端上调用Polymorphic方法时出错

时间:2014-04-29 14:56:45

标签: c# wcf

此错误是This上一个问题的结果。我试图从WCF客户端调用多态方法。这是我的合同:

public interface IOhmioService
{        
  [OperationContract]
  IEnumerable<Enumerador> GetEnumerador<T>() where T : IEnumerador, new();        
}

这是我的班级实施:

public class OhmioService : IOhmioService
{
  public IEnumerable<Enumerador> GetEnumerador<T>() where T : IEnumerador, new()
  {
      T _obj = new T();
      return _obj.Enumerar();  
  }
}

然后从客户端调用它:

public IEnumerable<Enumerador> Clients { get; set; } 
Clients = this.serviceClient.GetEnumerador<Clientes>();

如果我在课堂上调用此方法,一切正常。但是,如果我从WCF客户端调用它,则会收到此错误:

  

非泛型方法&#39; Ohmio.Client.OhmioService.OhmioServiceClient.GetEnumerador()&#39;   不能与类型参数一起使用

我做错了什么?谢谢!

更新

确定。我尝试了建议的解决方案,并得到了这个可怕的错误:

  

键入&#39; System.RuntimeType&#39;没有使用合同名称RuntimeType:http://schemas.datacontract.org/2004/07/System&#39;来指定。尝试使用DataContractResolver或将未知类型staticaly添加到已知类型列表中(例如,使用属性KnownTypeAttribute或将它们添加到已传递给DataContractSerializer的已知类型列表中)

毕竟,使用wcf上的泛型类型并不是一个好主意。我试图减少WCF服务上的重复代码。

1 个答案:

答案 0 :(得分:1)

您不能在WCF OperationContract中使用通用ServiceContract方法。有关详细信息,请参阅此处:WCF. Service generic methods

您需要将类型作为方法参数传递:

public interface IOhmioService
{        
  [OperationContract]
  IEnumerable<Enumerador> GetEnumerador(string typeName);       
}

public class OhmioService : IOhmioService
{
  public IEnumerable<Enumerador> GetEnumerador(string typeName)
  {
      var type = Type.GetType(typeName);
      var _obj = (IEnumerador)Activator.CreateInstance(type);
      return _obj.Enumerar();  
  }
}

<强>更新

见上面的更新;传递类型的完全限定名称。这不会导致序列化问题。