Спасибо Марку и всем остальным за предложения. Основываясь на ключевой идее Марка и генераторе идентификатора объекта Хенка, вот что у меня есть.
Foo определяет свойство Guid, которое содержит уникальный Guid. Это создается в конструкторе, но также может быть сохранено / восстановлено с помощью сериализации / десериализации.
class Foo
{
public Guid TheGuid = Guid.NewGuid();
}
Метр больше не использует ссылку, вместо этого он использует Guid:
class Meter
{
public Guid FooGuid;
}
Когда счетчик создан, Guid устанавливает соединение:
public void CreateMeter(int UserChoice)
{
Meter MyMeter = new Meter();
MyMeter.FooGuid = Manager.Foos[UserChoice].TheGuid;
}
Когда счетчик сериализуется / десериализуется, Guid сохраняется / загружается.
Единственный недостаток - доступ к экземпляру Foo, связанному со счетчиком. Вместо непосредственного использования ссылки необходимо выполнить поиск, который повлечет за собой снижение производительности:
class Manager
{
public List<Foo> Foos = new List<Foo>();
public Foo GetFooFromGuid(Guid SearchGuid)
{
// search Foos and return instance with Guid == SearchGuid
}
}
Преимущество этого подхода заключается в том, что теперь я могу создать делегата и иметь несколько источников Foo для связи со счетчиками:
Func<Guid, Foo> FooSource;
FooSource ManagerFooSource = Manager.GetFooFromGuid;