此错误是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服务上的重复代码。
答案 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();
}
}
<强>更新强>
见上面的更新;传递类型的完全限定名称。这不会导致序列化问题。