目标
我有一个通用类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>;
}
}
问题
我可以得到我想要的语法(在顶部)吗?如果没有,我能离多近?