Ho una classe lato server che rendo disponibile sul lato client attraverso un [DataContract]. Questa classe ha un campo di sola lettura che mi piacerebbe rendere disponibile attraverso una proprietà. Tuttavia, non sono in grado di farlo perché non mi sembra possibile aggiungere una proprietà [DataMember] senza averli entrambi impostati.WCF: esposizione diretta delle proprietà DataMember senza set?
Quindi, c'è un modo per avere una proprietà [DataMember] senza setter?
[DataContract]
class SomeClass
{
private readonly int _id;
public SomeClass() { .. }
[DataMember]
public int Id { get { return _id; } }
[DataMember]
public string SomeString { get; set; }
}
O sarà la soluzione è utilizzare il [DataMember] come il campo - (come per esempio mostrato here)? Ho provato anche a farlo, ma non sembra che il campo sia di mia competenza ..?
Modifica: è l'unico modo per creare una proprietà readonly hackerandola in questo modo? (No - non voglio fare questo ...)
[DataMember]
public int Id
{
get { return _id; }
private set { /* NOOP */ }
}
La tua idea di un setter NOOP farebbe sì che la proprietà non venga trasferita correttamente se stai usando WCF sul lato client: nella deserializzazione di 'DataContract', la classe viene istanziata senza chiamare alcun costruttore, e i setter di qualsiasi' Le proprietà DataMember vengono quindi passate qualsiasi cosa sia stata restituita dal getter di quella proprietà alla serializzazione. Quindi il tuo setter NOOP scarterebbe la proprietà, lasciando il suo valore come predefinito alla deserializzazione. Invece, scrivi un vero setter privato funzionante, oppure contrassegna la variabile di supporto come 'DataMember' invece di contrassegnare la proprietà. –