是否可以创建一个在其中创建新对象的通用对象池? 此外,如果此对象创建可以接收参数,那将是很好的。
public interface IPoolable
{
void Dispose();
}
public class ObjectPool<T> where T : IPoolable
{
private List<T> pool;
public T Get()
{
if(pool.count > 0)
{
return pool.Pop();
}
else
{
return new T(); // <- How to do this properly?
}
}
}
public class SomeClass : IPoolable
{
int id;
public SomeClass(int id)
{
this.id = id;
}
public void Dispose()
{
}
}
public class OtherClass : IPoolable
{
string name;
int id;
public OtherClass(string name, int id)
{
this.name = name;
this.id = id;
}
public void Dispose()
{
}
}
如果可以接收参数,可以像这样使用。
SomeClass a = myPool.Get(2);
OtherClass b = myOtherPool.Get("foo", 4);
如果参数不可能,这也没关系。
SomeClass a = myPool.Get();
a.id = 2;
OtherClass b = myOtherPool.Get();
b.name = "foo";
b.id = 4;
答案 0 :(得分:5)
您可以使用Activator.CreateInstance
Method
public static object CreateInstance(
Type type,
params object[] args
)
喜欢这个
return (T)Activator.CreateInstance(typeof(T), id);
但是,没有办法指定类型必须为构造函数提供参数;既不在接口声明中,也不在泛型类型约束中,也不在类继承中。
答案 1 :(得分:2)
你可以这样做:
public class ObjectPool<T>
{
private Queue<T> _pool = new Queue<T>();
private const int _maxObjects = 100; // Set this to whatever
public T Get(params object[] parameters)
{
T obj;
if (_pool.Count < 1)
obj = (T)Activator.CreateInstance(typeof(T), parameters);
else
obj = _pool.Dequeue();
return obj;
}
public void Put(T obj)
{
if (_pool.Count < _maxObjects)
_pool.Enqueue(obj);
}
}
答案 2 :(得分:2)
我正在寻找类似的东西,并且遇到了这个问题:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
这是一个非常不错的实现,我从here偷偷偷走了
它支持对从泛型类型参数继承的所有对象进行池化。