Вы можете позже получить доступ к этому члену в любом экземпляре:
int main()
{
int Car::*pSpeed = &Car::speed;
Car myCar;
Car yourCar;
int mySpeed = myCar.*pSpeed;
int yourSpeed = yourCar.*pSpeed;
assert(mySpeed > yourSpeed); // ;-)
return 0;
}
Обратите внимание, что вам нужен экземпляр для его вызова, поэтому он не работает как делегат.
Обычно использование интерфейса (т. Е. Чистого базового класса на C ++) является лучшим выбором дизайна.
Это ограничение XmlSerializer
, оно не сериализует свойства только для чтения, то, что вы сделали во втором примере, - это, по сути, хак, чтобы заставить его сериализоваться, однако это бесполезно, если вам нужно его десериализовать позже.
В качестве альтернативы вы можете переключиться на использование DataContractSerializer , это более гибко.
, если вы хотите иметь частные сеттеры и чтобы объект был сериализуемым / десериализуемым, impliment ISerializable и создать конструктор, такой как MyObject (информация SerializationInfo, контекст StreamingContext). Пример находится здесь .
Ограничение XMLSerializer
- Свойства без сеттера не могут быть сериализованы.
Но вы можете использовать DataContractSerializer
для сериализации private setter properties
-
[DataMember]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
private set {}
}
Атрибуты сериализации используются для сериализации и десериализации объектов. XmlSerializer предположит, что вам не нужно сериализовать любое свойство, которое не имеет сеттера. Сеттер будет использоваться при десериализации строки в объект, потому что нужно создать экземпляр объекта, а затем установщик будет использован для заполнения значения свойства.