C# 将类型参数传递给用于指定泛型类型的方法

C# 将类型参数传递给用于指定泛型类型的方法,c#,generics,C#,Generics,是否可以将泛型与类型参数混合使用?例如,有没有一种方法可以编写这样的代码: IList GetListOfListsOfTypes(Type[] types) { IList<IList> listOfLists = new List<IList>(); foreach (Type t in types) { listOfLists.Add(new List<t>()); } return listO

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

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

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

    return listOfLists.ToList();
}
IList GetListOfListsOfTypes(类型[]类型)
{
IList listOfLists=新列表();
foreach(类型中的类型t)
{
添加(新列表());
}
返回listOfLists.ToList();
}

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

要使用反射,必须从开放类型构造封闭泛型类型;然后,用我们的反射选项之一构造它。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 GetListOfListsOfTypes(类型[]类型)
{
IList listOfLists=新列表();
foreach(类型中的类型t)
{
类型requestedTypeDefinition=typeof(列表);
类型genericType=requestedTypeDefinition.MakeGenericType(t);
IList newList=(IList)Activator.CreateInstance(genericType);
添加(新列表);
}
返回列表;
}

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

< P>用反射来做,你必须从开放类型构造封闭的泛型类型;然后,用我们的反射选项之一构造它。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 GetListOfListsOfTypes(类型[]类型)
{
IList listOfLists=新列表();
foreach(类型中的类型t)
{
类型requestedTypeDefinition=typeof(列表);
类型genericType=requestedTypeDefinition.MakeGenericType(t);
IList newList=(IList)Activator.CreateInstance(genericType);
添加(新列表);
}
返回列表;
}

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

你不能使它与编译器一起工作。但是您可以使用反射调用泛型构造函数。此构造函数的可能副本不是该构造函数的副本,因为它使用泛型类型,而链接仅指定静态系统类型。您无法使其与编译器一起工作。但是您可以使用反射调用泛型构造函数。此函数的可能副本不是泛型构造函数的副本,因为它使用泛型类型,而链接仅指定静态系统类型。+1-这很好,因为在返回父列表后,它实际上会保留子列表的正确类型。+1-这很好,因为在返回父列表后,将实际保留子列表的正确类型。