1

我无法使这种情况发挥作用。这是模式-

[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[]' 类型”。

4

1 回答 1

1

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

于 2009-11-11T01:09:22.170 回答