如果给出以下代码,是否可以拥有一般类型的项目集合:
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,因为类的目的是确定并返回强类型对象的数组。
答案 0 :(得分:0)
不过,您可以列出具有运行时类型的非泛型。这个例子基本上就是你所追求的,但是它会产生一个运行时错误(只有例子1),因为AGeneric需要一个通用参数。如果您可以重构您不具备的通用性,那么您可以调整这项工作:
Type listType = typeof(List<>).MakeGenericType(typeof(AGeneric<>));
var answer = Activator.CreateInstance(listType);
以同样的方式,如果你必须有AGeneric,你可以用它的运行时类型制作列表
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<>>