创建泛型项列表

本文关键字:列表 泛型 创建 | 更新日期: 2023-09-27 18:04:13

给定以下代码,是否可能有一个泛型项的集合:

public abstract class AGeneric<T> {
internal virtual List<T>  MyList { get; set; } 
}

public class LibA<T> : AGeneric<T> {
internal override List<T>  MyList { get; set; } 
}
public class LibB<T> : AGeneric<T> {
internal override List<T>  MyList { get; set; } 
}
public class LibC<T> : AGeneric<T> {
internal override List<T>  MyList { get; set; } 
}
//.
//.
//.
Main {
    List<AGeneric>  test  = new List<AGeneric>(); //error - requires type; 
    List<BGeneric>  test2 = new List<BGeneric>();
    test2.first().

}
public abstract class BGeneric {
internal virtual List<T>  MyList { get; set; } //cant use T to provide implementation       
}

public class LibD<T> : BGeneric {
internal override List<T>  MyList { get; set; } 
}
public class LibE<T> : BGeneric {
internal override List<T>  MyList { get; set; } 
}
public class LibF<T> :BGeneric {
internal override List<T>  MyList { get; set; } 
}

目标是从抽象类实现各种类型的List,因为类的目的是确定并返回强类型对象的数组。

创建泛型项列表

不可以,但是您可以创建具有运行时类型的非泛型列表。这个例子基本上是你所追求的,但是它会生成一个运行时错误(只有例子1),因为Generic需要一个泛型参数。如果你能重组你所拥有的,而不是一个通用的,那么你可以适应这个工作:

Type listType = typeof(List<>).MakeGenericType(typeof(AGeneric<>));
var answer = Activator.CreateInstance(listType);

同样,如果你必须使用generic,你可以用它的运行时类型

来创建列表
int myRunTimeVariable = 0;
Type MyType = myRunTimeVariable.GetType();
Type listType = typeof(List<>).MakeGenericType(typeof(AGeneric<>).MakeGenericType(MyType));
var answer = Activator.CreateInstance(listType);
在本例中,

answer的类型为List<AGeneric<int>>。但它仍然不是List<AGeneric<>>