我将自己的 WCF 代理与 ClientBase 一起使用,我想做一些类似 svc 实用程序中的 ct 属性的事情,并告诉代理返回 List<> 集合类型。
我不能使用 List<> 因为实体由 nhibernate 管理所以我必须使用 IList
代理不是用 svcutil 生成的……我自己写的。
我怎样才能做到这一点?
我将自己的 WCF 代理与 ClientBase 一起使用,我想做一些类似 svc 实用程序中的 ct 属性的事情,并告诉代理返回 List<> 集合类型。
我不能使用 List<> 因为实体由 nhibernate 管理所以我必须使用 IList
代理不是用 svcutil 生成的……我自己写的。
我怎样才能做到这一点?
不幸的是,当合约中声明的类型是 IList 之类的接口类型时,无法控制 WCF 实际实例化的类型(实际上,它将是一个数组)。
请参阅http://msdn.microsoft.com/en-us/library/aa347850.aspx:
“在反序列化过程中,当声明的类型是接口时,序列化引擎选择实现了声明的接口的类型,并实例化该类型。已知类型机制(Data Contract Known Types中描述)在这里没有作用;选择类型内置于 WCF中。”
您应该能够手动修复代理中从“数组”到“列表”的所有引用——本质上只是一个乏味的查找和替换。
但是,如果由于某种原因这不起作用,您可以在代理类周围编写一个包装器,它将数组转换为列表。无论如何,这可能更容易:
private object[] myProperty
public List<object> MyProperty
{
get
{
return p.ToList();
}
set
{
//initialise if necessary
p = value.ToArray();
}
}