Как указать `ConcurrentDictionary.GetOrAdd` не добавлять значение?

У меня есть несколько случаях, когда я использую ConcurrentDictionaryдля кэширования значений, но часто мне нужно выполнить проверку значения, чтобы решить, добавлять ли его в кеш, используя ConcurrentDictionary.GetOrAdd(TKey, Func).

Как правило, примерно так:

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?

10
задан M.Babcock 28 March 2012 в 17:13
поделиться