Как создать пул объектов разного типа? - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь создать пул объектов, в котором будут объекты разных типов.

Будет ли это возможно, если я передал строку в качестве параметра ps в RetriveFunction ();он должен вернуть новый объект строкового типа или получить его из пула?

строка будет содержать имя типа.

Например;

    Object RetriveFromPool(string typename)
    {
          if()//object does not present
           {
               //return new object of typename
           }
          else
           {
               //feth it from pool
           }
     }

это будет возможно?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Да, это возможно.Словарь - это удобный способ хранить пары значений ключей с помощью поиска 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;
}
0 голосов
/ 10 февраля 2012

Если ваши типы известны во время компиляции, вам лучше использовать дженерики:

IDictionary<Type, object> Pool = new Dictionary<Type, object>();

T RetrieveFromPool<T>()
    where T : new()
{
    if (Pool.ContainsKey(typeof(T)))
    {
        return Pool[typeof(T)];
    }

    return Pool[typeof(T)] = new T();
}

Вот самый безопасный способ использования строк / отражений, который я могу придумать:

IDictionary<string, object> Pool = new Dictionary<string, object>();

object RetrieveFromPool(string typeName)
{
    if (Pool.ContainsKey(typeName))
    {
        return Pool[typeName];
    }

    Type type = Type.GetType(typeName);
    if (type == null)
    {
        return null;
    }

    ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
    if (ctor == null)
    {
        return null;
    }

    object obj = ctor.Invoke(new object[0]);
    Pool[typeName] = obj;
    return obj;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...