Вы можете получить шаг к тому, что ищете, используя OnDeserializingAttribute . Однако это, вероятно, позволит вам только установить свойства (так что вы можете иметь то, что составляет метод Copy, который заполняет все свойства текущего экземпляра, используя ваш статический экземпляр.
Я думаю, что если вы действительно хотите вернуть статические экземпляры, вам, вероятно, придется написать свой собственный десериализатор ...
Не проверено, но я бы предположил, что вы могли бы реализовать десериализатор довольно легко, как это:
public class MyDeserializer : System.Xml.Serialization.XmlSerializer
{
protected override object Deserialize(System.Xml.Serialization.XmlSerializationReader reader)
{
Foo obj = (Foo)base.Deserialize(reader);
return Foo.Get(obj.id);
}
}
Обратите внимание, что вам придется что-то предпринять для получения идентификатора, поскольку он является частным в вашем коде; Также предполагается, что вы используете сериализацию XML; Замените наследство тем, что вы на самом деле используете. И наконец, это означает, что вам придется создавать экземпляры этого типа при десериализации ваших объектов, что может включать изменение некоторого кода и / или конфигурации.