У меня есть несколько случаях, когда я использую ConcurrentDictionary
для кэширования значений, но часто мне нужно выполнить проверку значения, чтобы решить, добавлять ли его в кеш, используя ConcurrentDictionary
.
Как правило, примерно так:
private readonly ConcurrentDictionary<Type, ISomeObject> someObjectCache =
new ConcurrentDictionary<Type, ISomeObject>();
public ISomeObject CreateSomeObject(Type someType)
{
return someObjectCache.GetOrAdd(someType, type =>
{
if(!Attribute.IsDefined(someType, typeof(SomeAttribute))
// Do something here to avoid the instance from being added to
// `someObjectCache`
ISomeObject someObject;
// Typical factory functionality goes here
return someObject;
});
}
Способ, которым я обрабатываю это сегодня, состоит в том, чтобы генерировать исключение, которое, кажется, работает нормально, но я хотел бы более чистый подход (возможно, флаг, который я могу установить, или конкретное значение, которое я могу установите возвращаемое значение), чтобы отменить GetOrAdd
из лямбды (хотя его реально заменить полноценным методом).
Исходя из моего опыта работы с другими методами, подобными LINQ, возвращение null
приведет к тому, что значение будет добавлено без проверки как таковой (и чтение IL для GetOrAdd
выглядит так приведет к той же проблеме), поэтому я не думаю, что это сработает.
Есть ли способ избежать использования исключений для отмены добавления с помощью GetOrAdd
?