Esempio n. 1
0
        /// <summary>
        /// Получить из пула объект определенного типа
        /// </summary>
        /// <param name="parT">Реальный тип объекта</param>
        /// <returns></returns>
        public object GetObject(Type parT)
        {
            if (PoolContents.ContainsKey(parT))
            {
                Stack <PoolSupportedObject> stackContents = PoolContents[parT];
                if (stackContents.Count > 0)
                {
                    ObjectPoolSupportData supportData = TypesSupportData[parT];
                    PoolSupportedObject   retObject   = stackContents.Pop();
                    retObject.ActualLinkedObjectPoolSupportData = supportData;
                    return(retObject);
                }
            }

            object newPoolObjectInstance = ProduceNewObject(parT);

            return(newPoolObjectInstance);
        }
Esempio n. 2
0
        /// <summary>
        /// Сохранить объект в пуле для последующего использования
        /// </summary>
        /// <param name="parObjectToStore">Объект, который будет утилизирован</param>
        /// <typeparam name="T">Тип утилизируемого объекта</typeparam>
        public void StoreObject <T>(T parObjectToStore) where T : PoolSupportedObject
        {
            Type t = parObjectToStore.GetType();

            //нам нужно полностью "сбросить" объект
            ObjectPoolSupportData supportData = TypesSupportData[t];

            ObjectExtensions.RemoveSubscribedMethods(parObjectToStore, supportData.EventsMetaInfo);
            ObjectExtensions.RemoveAllFields(parObjectToStore, supportData.FieldsMetaInfo);

            if (PoolContents.ContainsKey(t))
            {
                PoolContents[t].Push(parObjectToStore);
            }
            else
            {
                Stack <PoolSupportedObject> stackContents = new Stack <PoolSupportedObject>();
                stackContents.Push(parObjectToStore);
                PoolContents.Add(t, stackContents);
            }
        }