2012-02-10 23 views
1

我正在尝试创建一个对象池,其中包含不同类型的对象。如何创建不同类型的对象池?

是否有可能,如果我传递一个字符串作为ps参数给RetriveFunction(); 它应该rturn一个新的对象的字符串类型或从池中获取?

字符串将包含类型的名称。

例如;

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

它有可能吗?

回答

2

是的,这是可能的。字典是存储键值对与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

是否可以避免反射? – 2012-02-10 13:31:32

+0

@NIleshLanke查看更新。 – 2012-02-10 13:34:20

+0

@ rich.okelly补偿你,你一直在窃取我的想法!我们正在同一页面上思考。尽管如此,你在第一个样本中有一个错误。你永远不会存储新实例化的对象。实际上,第二个也一样。 – Zenexer 2012-02-10 13:35:47

0

如果你的类型是在编译时已知的,你将与仿制药更好:

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; 
} 
相关问题