如何创建从具有不同类型的相同generics类inheritance的对象列表?

我花了几个小时上下试图找到答案,我可能无法正确处理问题,这没有用。 基本上,我有一个抽象类:

public abstract class GenericType { ... } 

还有一堆inheritance自它的类:

 public class AType: GenericType { ... } public class BType: GenericType { ... } ... 

最后,我有另一个类想要包含从GenericTypeinheritance的事物列表,无论T的值如何,即Atypes,BTypes等等。

我的第一次尝试是使用ListList<GenericType>但是他们给了我任何快乐。

关于我应该怎么做的任何提示? 非常感谢!

所以,如果我理解正确,你想要这样的东西:

 List 

其中可以包含任何ATypeAType等实例。只需将GenericType本身作为GenericType的子类即可:

 public class GenericType { } public class GenericType : GenericType { } public class AType : GenericType { } public class BType : GenericType { } 

然后,您可以将任何实例粘贴到List

如何创建一个通用的对象列表,这些对象被约束为从使用不同类型参数构造的同一generics类inheritance?

这在C#类型系统中是不可能的; 你只能制作一个实际类型的列表,而不是“类型模式”,如“ List ,其中U必须是Foo对于某些未指定的T”。

为了了解为什么这是不可能的,让我们假设它是可能的。 我们将“类型模式”注释为问号:

 class Stack { ... } ... List> listOfStacks = new List>(); listOfStacks.Add(new Stack()); listOfStacks.Add(new Stack()); 

太好了。 现在你打算怎么处理堆栈列表? 对于涉及堆栈类型参数的堆栈,您无法安全地执行任何操作

 listOfStacks[0].Push("hello"); 

这应该在编译时失败,因为插槽零中的堆栈是一堆int而不是字符串。 编译器怎么知道呢? 编译器无法知道。 通过允许此function,您实际上破坏了编译器对您的程序进行类型检查的能力。

回答“我怎么做这个不可能的事情?” 了解你为什么要做不可能的事情是有帮助的。 而不是试图做这个不可能的事情告诉我们你真正想做什么 ,看看是否有人可以解决真正的问题。

如果GenericType实现了非通用接口IAmNotGeneric ,则可以将ATypeAType都添加到List

 public abstract class GenericType : IAmNotGeneric 

同一原则可以应用于非generics抽象基类。

 public abstract class GenericType : NonGenericType 

您是指具有每个派生类型的实例的列表吗?

 Assembly.GetExecutingAssembly().GetTypes .Where(type => type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(GenericType<>)) .ToList(). .ForEach(type => list.Add(Activator.CreateInstance(type)));