/// <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)); }
/// <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); }
/// <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; }