Exemplo n.º 1
0
        /// <summary>
        /// Создать новый экземпляр класса запрошенного типа
        /// </summary>
        /// <param name="parT">Запрошенный тип</param>
        /// <returns></returns>
        private object ProduceNewObject(Type parT)
        {
            ObjectPoolSupportData supportData = null;

            if (TypesSupportData.ContainsKey(parT))
            {
                supportData = TypesSupportData[parT];
            }
            else
            {
                supportData = new ObjectPoolSupportData(this, parT);
                TypesSupportData.Add(parT, supportData);
            }

            return(Activator.CreateInstance(parT, supportData));
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
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);
            }
        }
 /// <summary>
 /// Обязательный конструктор
 /// </summary>
 /// <param name="parSupportData">Информация о работе с пулом</param>
 protected PoolSupportedObject(ObjectPoolSupportData parSupportData)
 {
     ActualLinkedObjectPoolSupportData = parSupportData;
 }