是的,这是可能的。字典是存储键值对与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;
}
是否可以避免反射? – 2012-02-10 13:31:32
@NIleshLanke查看更新。 – 2012-02-10 13:34:20
@ rich.okelly补偿你,你一直在窃取我的想法!我们正在同一页面上思考。尽管如此,你在第一个样本中有一个错误。你永远不会存储新实例化的对象。实际上,第二个也一样。 – Zenexer 2012-02-10 13:35:47