我有几种ConcurrentDictionary<TKey, TValue>
用于缓存值的情况,但通常我需要对值进行验证以决定是否使用ConcurrentDictionary<TKey, TValue>.GetOrAdd(TKey, Func<TKey, TValue>)
.
通常遵循以下原则:
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
从lambda(尽管它实际上可以被一个完整的方法取代)。
根据我对其他类似 LINQ 的方法的经验,返回null
将导致值被添加而不被检查(并且读取 ILGetOrAdd
看起来会导致同样的问题),所以我不认为'会工作的。
有什么方法可以避免使用异常来取消添加使用GetOrAdd
?