Если вам нужно, чтобы кеш возвращал то же значение, что и кешированное, вы можете сериализовать объект и десериализовать его, чтобы получить исходные значения. Следующий код не тестировался, но я уже использовал эту идею для других целей:
using Newtonsoft.Json;
public class CacheObject<T>
{
private string serializedValue;
public CacheObject(T value)
{
// TODO: Add-in serializer settings as needed
this.serializedValue = JsonConvert.SerializeObject(value);
}
public T Value
{
get
{
// TODO: Add-in serializer settings as needed
return JsonConvert.DeserializeObject<T>(this.serializedValue);
}
}
}
public static class CacheExtensions
{
public static void Set<T>(this ObjectCache cache, string key, T value, CacheItemPolicy policy)
{
cache.Set(key, new CacheObject<T>(value), policy);
}
public static T Get<T>(this ObjectCache cache, string key)
{
return (T)(cache.Get(key)?.Value);
}
}
Если вы действительно хотите, чтобы возвращаемые объекты были неизменяемыми (это означает, что изменение их значения должно завершиться ошибкой или быть неактивным), то нет способа выполнить это в общем, как вы говорите, что хотите. Один из вариантов, который приходит на ум, — это использование абстрактного абстрактного базового класса, доступного только для чтения, который вы сохраняете в кеше, и создаете неабстрактный дочерний класс, который вы используете, когда вам нужно, чтобы данные были доступны для записи.
Как следует из ответов на вопрос, рекомендованный Алексеем в комментариях, другой вариант - реализовать класс однократной записи, но сам по себе это немалый подвиг и может не обеспечить требуемой гибкости.
person
M.Babcock
schedule
22.04.2021
instance.Text = "123";
должен возвращать ошибку или просто быть неактивным)? - person M.Babcock   schedule 23.04.2021