将集合的通用定义作为类型参数传递 - 或如何使用“List<>”作为类型参数

时间:2011-09-30 03:02:17

标签: c# generics c#-4.0

我会尽可能地直截了当。

我希望能够做到这样的事情:

var mylookup = new ModifiableLookup<MyClass, int, List<> >();
var myhashlookup = new ModifiableLookup<MyClass, int, HashSet<> >();

虽然有这样的通用类:

class ModifiableLookup<TKey, TElement, TElementCollection<> > : ILookup<TKey, TElement>
    where TElementCollection<> : ICollection<TElement>, new()
{
    private Dictionary<TKey, TElementCollection<TElement> > data;
    /// ... so on and so forth
}

但是,唉,这不起作用......

解决方法是重复类型参数:

var mylookup = new ModifiableLookup<MyClass, int, List<int> >();
///...
class ModifiableLookup<TKey, TElement, TElementCollection> : ILookup<TKey, TElement>
    where TElementCollection : ICollection<TElement>, new()

有没有办法在不重复收集元素类型参数且不使用反射的情况下完成这样的事情?

1 个答案:

答案 0 :(得分:2)

不,在你的限制范围内不可能。打开泛型类型只能作为typeof运算符的参数出现。它们不允许在您的来源的任何其他地方使用。