我试图在WCF客户端上使用此方法:
public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador(Type type);
}
public class OhmioService : IOhmioService
{
public IEnumerable<Enumerador> GetEnumerador(Type type)
{
var _obj = (IEnumerador)Activator.CreateInstance(type);
return _obj.Enumerar();
}
}
并实现如下:
public IEnumerable<Enumerador> GetEnumerador(Type type)
{
dynamic _obj = Activator.CreateInstance(type);
return (IEnumerable<Enumerador>)_obj.Enumerar();
}
由于类型未知,它给了我错误,但我不明白为什么。返回类型由服务器和客户端知道。我只是试图从客户端告诉要创建的对象类型。我确定如果我将Type参数作为字符串传递给例如并使用选择案例,它将正常工作。 是否有另一种方法在WCF服务上执行泛型方法?谢谢!
更新
这是我得到的错误:
键入&#39; System.RuntimeType&#39;没有使用合同名称RuntimeType:http://schemas.datacontract.org/2004/07/System&#39;来指定。尝试使用DataContractResolver或将未知类型staticaly添加到已知类型列表中(例如,使用属性KnownTypeAttribute或将它们添加到已传递给DataContractSerializer的已知类型列表中)
答案 0 :(得分:4)
Generics are not supported by WCF
话虽如此,我假设您正在将Type
的子类传递给GetEnumerador
。问题在于虽然您的服务知道类型Type
的参数,因此隐式为其创建DataContract
,但它不知道任何其他类。这使序列化失败。
为了解决这个问题,你需要明确地创建子类。你有几个选择
DataContractResolver
ServiceKnownTypes
为您的合同添加注释,提供两种选择:
ServiceKnownTypes
注释静态声明子类,每个子类一个编辑1 :如果您确定要尝试序列化Type对象,请查看显示常见问题解决方案的this other question。
编辑2(OP更新后):
该错误表示您将System.RuntimeType
对象传递给GetEnumerador
。实际上,假设System.Type
是抽象的,GetEnumerador
将始终接收它的子类。
正如我之前所说,WCF只知道Type
这是你在合同中指定的内容,因此它会产生错误,因为它不知道如何序列化System.RuntimeType
。我首先列举的选项仍然适用。例如,你可以试试这个:
[ServiceKnownType(typeof(System.RuntimeType))]
public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador(Type type);
}
如果您确定GetEnumerador
始终会收到System.RuntimeType
,则可以选择
public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador(RuntimeType type);
}
总而言之,我建议不要序列化Type
,但如果出于某种原因你觉得必须这样做,请看一下the linked question。