2009-11-10 11 views
1

Je ne peux pas faire fonctionner ce scénario. Voici le Pattern WCF DataContract avec un tableau DataMember abstrait

[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; 

J'ai essayé pratiquement tout annoter avec KnownType ou KnownServiceType en vain.

Si je fais un résumé BaseT, j'obtiens une erreur de désérialisation 'ne peut pas instance de classe abstraite'. Si je fais du béton BaseT, je n'obtiens pas d'erreur de désérialisation. Au lieu de cela, quand je vais le lancer sur ChildT, je suis "incapable de lancer l'objet de type 'BaseT []' pour taper 'ChildT []'".

Répondre

1

Si la définition de l'objet BaseT est étiquetée avec KnownType et que la liste ChildT y figure, elle fonctionnera correctement avec la base abstraite (je le fais tout le temps). Votre problème est que la covariance du tableau n'est pas autorisée en C#, vous ne pouvez donc pas lancer BaseT [] en ChildT []. La conversion des éléments individuels en ChildT fonctionnera, cependant - vous pouvez le voir si vous inspectez le tableau dans le débogueur - si vous avez besoin d'un ChildT [] laissez LINQ faire le travail pour vous (par exemple, baseArray.Cast(). ToArray()).

+0

Dieu J'aime ce site. Génial, merci beaucoup. –