2009-11-10 83 views
1

我无法使此方案正常工作。这里的模式 -带有抽象DataMember数组的WCF DataContract

[DataContract] 
/*abstract*/ class BaseT 
{ ... } 

[DataContract] 
class ChildT : BaseT 
{ ... } 

[DataContract] 
class MessageContents 
{ 
    [DataMember] 
    public BaseT[] XX; // Array of BaseT objects. I need WCF to somehow figure out that they're actually ChildT. 
} 

// ...receive a webHttp request of type MessageContents... 

// cast to use MessageContents.XX as a ChildT[] instead of a BaseT[] 
ConcreteClass[] QQ = (ConcreteClass[])request.xx; 

我已经尝试使用KnownType或KnownServiceType几乎所有注释都无济于事。

如果我使BaseT抽象,我得到一个反序列化错误'不能实例抽象类'。如果我使BaseT具体化,我不会遇到反序列化错误。相反,当我将它转换为ChildT时,我得到“无法投射'BaseT []'类型的对象来键入'ChildT []'”。

回答

1

如果你有用KnownType标记的BaseT对象定义并在那里列出ChildT,它对抽象基础(我一直这样做)将正常工作。你的问题是C#中不允许使用数组协变,所以你不能将BaseT []转换为ChildT []。将单个元素转换为ChildT可以工作 - 如果您在调试器中检查数组,您可以看到这一点 - 如果您需要一个ChildT []让LINQ为您完成工作(例如baseArray.Cast()。ToArray() )。

+0

上帝我爱这个网站。非常感谢,非常感谢。 – 2009-11-11 14:24:10