Пример #1
0
        /// <summary>
        /// 尝试获取到对应资源;
        /// </summary>
        public bool TryGet <T>(string key, out T value)
            where T : class
        {
            ThrowIfKeyInconformity <T>(key);

            using (objectCollectionLock.ReadLock())
            {
                WeakReferenceObject obj;
                if (objectCollection.TryGetValue(key, out obj))
                {
                    WeakReferenceObject <T> weakReferenceObject = obj as WeakReferenceObject <T>;
                    if (weakReferenceObject != null)
                    {
                        return(weakReferenceObject.TryGetTarget(out value));
                    }
                }
                value = default(T);
                return(false);
            }
        }
Пример #2
0
        /// <summary>
        /// 读取到资源,若已经存在则直接返回;
        /// </summary>
        public T Load <T>(string key, Func <T> loader)
            where T : class
        {
            ThrowIfKeyInconformity <T>(key);
            if (loader == null)
            {
                throw new ArgumentNullException(nameof(loader));
            }

            using (objectCollectionLock.UpgradeableReadLock())
            {
                WeakReferenceObject obj;
                if (objectCollection.TryGetValue(key, out obj))
                {
                    WeakReferenceObject <T> weakReferenceObject = obj as WeakReferenceObject <T>;
                    if (weakReferenceObject == null)
                    {
                        throw InvalidType <T>(key);
                    }
                    else
                    {
                        T asset;
                        if (weakReferenceObject.TryGetTarget(out asset))
                        {
                            return(asset);
                        }
                        else
                        {
                            return(InternalReplace(key, obj, loader));
                        }
                    }
                }
                else
                {
                    return(InternalAdd(key, loader));
                }
            }
        }
Пример #3
0
        /// <summary>
        /// 获取到对应资源,若不存在则返回异常;
        /// </summary>
        public T Get <T>(string key)
            where T : class
        {
            ThrowIfKeyInconformity <T>(key);

            using (objectCollectionLock.ReadLock())
            {
                WeakReferenceObject obj;
                if (objectCollection.TryGetValue(key, out obj))
                {
                    WeakReferenceObject <T> weakReferenceObject = obj as WeakReferenceObject <T>;
                    if (weakReferenceObject != null)
                    {
                        T asset;
                        if (weakReferenceObject.TryGetTarget(out asset))
                        {
                            return(asset);
                        }
                    }
                }
                throw new KeyNotFoundException(key);
            }
        }