Похоже, что одно из ваших требований заключается в том, что отдельные потоки или процессы, которые обращаются к объекту сущности, не должны видеть личные данные друг друга.Боюсь, это довольно хороший признак того, что личные данные не должны находиться в объекте сущности, который ими совместно используется.Вместо этого каждый процесс должен иметь свои личные данные.На самом деле он не обязательно должен быть в самом объекте сущности, но его можно связать с объектом сущности через частный словарь:
private Dictionary<Entity, object> myPrivateEntityData = new ...;
Более того, поскольку теперь он является частнымк процессу, и процесс, по-видимому, точно знает, какие данные он хочет связать с каждой сущностью, теперь вы можете сделать его полностью безопасным.
private Dictionary<Entity, SuperSecretSpecialData> myPrivateEntityData = new ...;
private sealed class SuperSecretData {
public bool NoOne;
public int ElseBut;
public string MeCan;
public DateTime SeeThis;
}
Существует некоторая боль, связанная с необходимостью проверить, каждая лиСначала в словаре есть сущность, но вы тоже можете это исправить.Лично я использую класс AutoDictionary
, который просто расширяет Dictionary
таким образом, что он автоматически создает объекты, когда они отсутствуют:
public sealed class AutoDictionary<TKey, TVal> : Dictionary<TKey, TVal> where TVal : class, new()
{
public new TVal this[TKey key]
{
get
{
if (!ContainsKey(key))
Add(key, new TVal());
return base[key];
}
set
{
base[key] = value;
}
}
}
private AutoDictionary<Entity, SuperSecretSpecialData> myPrivateEntityData = new ...;
Тогда вы можете легко получить доступ к myPrivateEntityData[someEntity].NoOne
(и т. Д.) Ион просто сработает и никогда не выдаст исключение, потому что ключа там нет, но вы все равно можете использовать ContainsKey
, если вы хотите , чтобы проверить, существует ли он.