Domanda

Non riesco a fare questo lavoro scenario. Ecco lo schema -

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

Ho provato annotazione praticamente tutto con KnownType o KnownServiceType senza alcun risultato.

Se faccio BaseT astratto, ottengo un errore di deserializzazione 'non posso istanza di una classe astratta'. Se faccio BaseT concreto, non ottengo un errore di deserializzazione. Invece, quando vado a gettarlo ai ChildT, sto ottenendo "in grado di cast di oggetti di tipo 'BaseT []' per digitare 'ChildT []'".

È stato utile?

Soluzione

Se avete la definizione dell'oggetto BaseT taggati con KnownType e la lista ChildT lì, funzionerà bene con la base astratta (Lo faccio tutto il tempo). Il tuo problema è che covarianza di matrice non è consentito in C #, quindi non si può lanciare BaseT [] per ChildT []. Casting i singoli elementi a ChildT funzionerà, anche se-si può vedere questo se si ispezionare la matrice nella debugger- se avete bisogno di un ChildT [] diamo LINQ fare il lavoro per voi (ad esempio, baseArray.Cast (). ToArray () ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top