Поскольку для объекта, который может быть сериализован XML, нужен открытый конструктор без параметров, кажется, что у вас есть дыра в дизайне вашего класса даже до того, как вы нажмете сериализацию XML.
Лично я бы пошел с ленивым вычислением этих полей. Храните флаг внутри класса, независимо от того, были ли вы рассчитаны поля или нет, и установите для этого поля значение, обозначающее «устаревшее», когда изменяется какое-либо из свойств, используемых в вычислении. Затем в свойствах, возвращающих вычисленные значения, проверьте, нужно ли пересчитывать, прежде чем возвращать значение.
Это будет работать независимо от сериализации XML или нет.
пример:
[XmlType("test")]
public class TestClass
{
private int _A;
private int? _B;
public TestClass()
: this(0)
{
}
public TestClass(int a)
{
_A = a;
}
[XmlAttribute("a")]
public int A
{
get { return _A; }
set { _A = value; _B = null; }
}
[XmlIgnore]
public int B
{
get { if (_B == null) Recalculate(); return _B; }
set { _B = value; }
}
private void Recalculate()
{
_B = _A + 1;
}
}
Это то, что я искал. Однако разочарование это не работает с XML. Думаю, я просто сделаю заметку, чтобы вызвать метод вручную. Это просто проще. –