1

是否可以将泛型与类型参数混合使用?例如,有没有办法编写这样的代码:

IList GetListOfListsOfTypes(Type[] types)
{
    IList<IList> listOfLists = new List<IList>();

    foreach (Type t in types)
    {
        listOfLists.Add(new List<t>());
    }

    return listOfLists.ToList();
}

显然,编译器不喜欢这样,但是有什么方法可以实现吗?

4

1 回答 1

4

要使用反射来做到这一点,您必须从开放类型构造封闭的泛型类型;然后用我们有反射的选项之一来构造它。Activator.CreateInstance 非常适合:

IList GetListOfListsOfTypes(Type[] types)
{
    IList<IList> listOfLists = new List<IList>();

    foreach (Type t in types)
    {
        Type requestedTypeDefinition = typeof(List<>);
        Type genericType = requestedTypeDefinition.MakeGenericType(t);
        IList newList = (IList)Activator.CreateInstance(genericType);
        listOfLists.Add(newList);
    }

    return listOfLists;
}

请注意,您正在从此方法返回非泛型列表IList,这是必要的,因为我们在编译时不知道类型,因此为了使用新的泛型列表,您可能需要再次使用反射. 考虑是否值得 - 当然,这取决于您的要求。

于 2013-10-16T20:59:27.713 回答