103 votes

WCF étouffe sur les propriétés qui n'ont pas "ensemble ". Aucune solution de contournement?

J'ai un peu de classe que je suis de passage en tant que résultat d'une méthode de service, et que la classe a une seule propriété:

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message { get { return ""; } }
}

J'obtiens une exception sur le côté service:

System.Runtime.Serialization.InvalidDataContractException: 
No set method for property 'Message' in type 'MyNamespace.ErrorBase'.

- Je avoir cette propriété uniquement de lecture, je ne peux pas autoriser les utilisateurs à lui assigner une valeur. Aucune solution de contournement que je pourrais utiliser? Ou ai-je raté quelque attribut supplémentaire?

Merci!

112voto

rh. Points 878

Donner un Message à un public de lecture, mais protégé setter, de sorte que seuls les sous-classes (et le DataContractSerializer, parce qu'il triche :) peut modifier la valeur.

13voto

Russell Points 6893

Même si vous n'avez pas besoin de mettre à jour la valeur, le setter est utilisé par le WCFSerializer pour désérialiser un objet (et de re-définir la valeur).

C'est DONC ce que vous êtes après: http://stackoverflow.com/questions/172681/wcf-datacontracts

12voto

Rikin Patel Points 1314
[DataMember(Name = "PropertyName")]
public string PropertyName
{
    get
    {
        return "";
    }
    private set
    { }
}

5voto

marc_s Points 321990

Ne pourriez-vous pas juste un "ne rien faire" setter??

[DataContract]
public class ErrorBase
{
  [DataMember]
  public virtual string Message 
  {
      get { return ""; } 
      set { }
  }
}

Ou ne le DataContract sérialiseur barf, trop??

2voto

Jojo Sardez Points 4727

Propriétés avec DataMember attribut nécessite toujours ensemble. Vous devez écrire simmilar objet sur l'application cliente depuis DataContract les membres peuvent toujours être affectées des valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X