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