Да, это возможно. Словарь представляет собой удобный способ для хранения пар ключей значения с O (1) поиском и Activator
способен инстанцированием типа, известным только во время выполнения:
private IDictionary<string, object> _objectPool;
object RetriveFromPool(string typeName)
{
if(_objectPool.ContainsKey(typeName))
{
return _objectPool[typename]; // return from the pool
}
return Activator.CreateInstance(Type.GetType(typeName)); // Try to create a new object using the default constructor
}
В качестве альтернативного однако (для обеспечения компиляции проверки типов времени) вы возможно, пожелает использовать дженерики для достижения этой цели:
private IDictionary<Type, object> _objectPool;
public T RetrieveFromPool<T>() where T : new()
{
Type type = typeof(T);
return _objectPool.ContainsKey(type) ? (T)_objectPool[type] : new T();
}
// Update - add a couple of templates for add methods:
public void AddToPool<T>() where T : new
{
_objectPool[typeof(T)] = new T();
}
public void AddToPool<T>(T poolObject) where T : new
{
_objectPool[typeof(T)] = poolObject;
}
Можно ли избежать отражения? –
@NIleshLanke См. Обновление. –
@ rich.okelly Дарн, ты продолжаешь красть мои идеи! Мы думаем точно на одной странице. Однако у вас есть ошибка в вашем первом образце. Вы никогда не храните вновь созданный объект. На самом же деле это второй. – Zenexer