如何从Type类型创建对应真实类型的泛型集合(如List<T>)
问题解答
首先明确:你想要的这种直接返回编译期未知的具体泛型类型(比如List<int>)的方法,在C#里是无法实现的。
原因很简单:C#是静态类型语言,方法的返回类型必须在编译阶段就确定下来。而你手里的Type参数是运行时才会明确的类型信息,编译期根本不知道它具体对应哪个类型,自然没法把它作为泛型参数来定义方法的返回类型(比如static List<itemType> Create(Type itemType)这种写法本身就不符合语法,因为itemType是变量不是类型)。
不过你可以通过反射来创建对应类型的泛型集合实例,只是方法的返回类型只能是object,之后你可以在调用方根据实际情况做类型转换或者动态处理:
反射实现代码
static object Create(Type itemType) { // 构建对应的List<T>泛型类型 var genericListType = typeof(List<>).MakeGenericType(itemType); // 创建该类型的实例 return Activator.CreateInstance(genericListType); }
使用示例
如果调用时你明确知道itemType对应的具体类型,可以直接强制转换:
// 创建List<int>实例 var intList = (List<int>)Create(typeof(int)); intList.Add(123); // 正常编译,强类型操作
如果调用时也不知道具体类型,可以用dynamic来做运行时的方法调用:
Type itemType = ...; // 运行时获取的类型 dynamic dynamicList = Create(itemType); dynamicList.Add(Activator.CreateInstance(itemType)); // 运行时解析Add方法
补充说明
如果想要编译期就拿到强类型的泛型集合,你还是得用最初的泛型方法static List<T> Create<T>()——但这要求你在编译时就知道T的具体类型,而不是只有运行时的Type对象。
内容的提问来源于stack exchange,提问作者AnGG
相关产品推荐
相关产品推荐

