如何创建从具有不同类型的相同generics类inheritance的对象列表?
我花了几个小时上下试图找到答案,我可能无法正确处理问题,这没有用。 基本上,我有一个抽象类:
public abstract class GenericType { ... }
还有一堆inheritance自它的类:
public class AType: GenericType { ... } public class BType: GenericType { ... } ...
最后,我有另一个类想要包含从GenericTypeinheritance的事物列表,无论T的值如何,即Atypes,BTypes等等。
我的第一次尝试是使用List
和List<GenericType>
但是他们给了我任何快乐。
关于我应该怎么做的任何提示? 非常感谢!
所以,如果我理解正确,你想要这样的东西:
List
其中可以包含任何AType
, AType
等实例。只需将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
,则可以将AType
和AType
都添加到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)));