I have a server side class which I make available on the client side through a [DataContract]. This class has a readonly field which I’d like to make available through a property. However, I’m unable to do so because it doesn’t seem that I’m allowed to add a [DataMember] property without having both get and set.
So – is there a way to have a [DataMember] property without setter?
[DataContract]
class SomeClass
{
private readonly int _id;
public SomeClass() { .. }
[DataMember]
public int Id { get { return _id; } }
[DataMember]
public string SomeString { get; set; }
}
Or will the solution be use the [DataMember] as the field – (like e.g. shown here)? Tried doing this too, but it doesn’t seem to care the field is readonly..?
Edit: Is the only way to make a readonly property by hacking it like this? (no – I don’t want to do this…)
[DataMember]
public int Id
{
get { return _id; }
private set { /* NOOP */ }
}
Your “server-side” class won’t be “made available” to the client, really.
What happens is this: based on the data contract, the client will create a new separate class from the XML schema of the service. It cannot use the server-side class per se!
It will re-create a new class from the XML schema definition, but that schema doesn’t contain any of the .NET specific things like visibility or access modifiers – it’s just a XML schema, after all. The client-side class will be created in such a way that it has the same “footprint” on the wire – e.g. it serializes into the same XML format, basically.
You cannot “transport” .NET specific know-how about the class through a standard SOAP-based service – after all, all you’re passing around are serialized messages – no classes!
Check the “Four tenets of SOA” (defined by Don Box of Microsoft):
See point #3 – services share schema and contract, not class – you only ever share the interface and XML schema for the data contract – that’s all – no .NET classes.