目标
我有一个通用类 GenericClass<T>
,想要对实例进行池化。
我希望看到是否能够获得以下语法:
MyGenericPool = new GenericPool<GenericClass>();
// Or maybe it's MyGenericPool = new GenericPool<GenericClass<>>();
GenericClass<TGenericParam> GenericClassInstance =
MyGenericPool.Get<TGenericParam>();
我的理解是,泛型不支持这样的语法,因此无法实现。但我很想知道其他人怎么看。
我的思路
从我的理解来看,类型GenericClass<string>
和GenericClass<int>
在类型系统的角度并没有关联。
但是,我意识到我可以做到接近,例如:
GenericClass<TGenericParam> GenericClassInstance =
GenericPool.Get<GenericClass<TGenericParam>>();
然后让
GenericPool
只存储一个Dictionary<Type, ObjectPool<object>>
。我想知道能否避免这种做法。当作为调用者时,我只改变泛型类型参数,不想每次都要指定泛型类型。我还想在编译时强制执行所有进入我的
GenericObjectPool<T>
的对象都是设置的泛型类型(T<>
)。
我认为问题在于无法将泛型类型参数视为本身是泛型的。如果可以这样做(我已经可以了吗?),那么可能以下内容就可以工作:
public class GenericClassPool<TGeneric> where TGeneric : class<>
{
private readonly Dictionary<Type, object> objectPools = new Dictionary<Type, object>();
private void EnsureObjectPoolExists<TGenericParam>()
{
if (!objectPools.ContainsKey(typeof(TGenericParam)))
{
objectPools.Add(typeof(TGenericParam), new ObjectPool<TGeneric<TGenericParam>>(() => Activator.CreateInstance(typeof(TGeneric<TGenericParam>)) as TGeneric<TGenericParam>));
}
}
private ObjectPool<TGeneric<TGenericParam>> GetPool<TGenericParam>()
{
EnsureObjectPoolExists<TGenericParam>();
return (objectPools[typeof(TGenericParam)] as ObjectPool<TGeneric<TGenericParam>>);
}
public void Add<TTypeParam>(TGeneric<TGenericParam> obj)
{
EnsureObjectPoolExists<TTypeParam>();
GetPool<TGenericParam>().Add(obj);
}
public TGeneric<TGenericParam> Get<TGenericParam>()
{
return GetPool<TGenericParam>().Get() as TGeneric<TGenericParam>;
}
}
问题
我能获得我想要的语法吗(在顶部)?如果不行,我可以得到多接近的语法?
TGeneric <TGenericParam>
。 - Cristian Lupascu