Pour pousser la solution un peu plus loin et permettre à la désérialisation de fonctionner également...
public class A
{
private int _id = -1;
public int Id
{
get { return _id; }
set
{
if (_id < 0)
throw new InvalidOperationException("...");
if (value < 0)
throw new ArgumentException("...");
_id = value;
}
}
}
Cela permettra Id
ne doit être défini qu'une seule fois à une valeur supérieure ou égale à 0. Toute tentative de le définir par la suite se soldera par un échec. InvalidOperationException
. Cela signifie que XmlSerializer
sera en mesure de définir Id
pendant la désérialisation, mais il ne pourra jamais être modifié après. Notez que si la propriété est un type de référence, vous pouvez simplement vérifier si elle est nulle.
Ce n'est peut-être pas la meilleure solution si vous avez beaucoup de propriétés en lecture seule à sérialiser/désérialiser, car cela nécessiterait beaucoup de code passe-partout. Cependant, j'ai trouvé cette solution acceptable pour les classes avec 1 à 2 propriétés en lecture seule.
C'est toujours un hack, mais c'est au moins un petit plus robuste.