C# 一个列表中有多个不同类型的对象

C# 一个列表中有多个不同类型的对象,c#,list,object,subclass,base,C#,List,Object,Subclass,Base,是否可以将更多不同类型的对象添加到同一列表中?我该怎么做 我有一个基类和三个子类,我希望所有的子类对象都在同一个列表中 Sure-只需使用基本类型作为泛型类型参数创建一个列表: List<Control> controls = new List<Control>(); controls.Add(new TextBox()); controls.Add(new Label()); controls.Add(new Button()); // etc 如果要获取特定类型(或

是否可以将更多不同类型的对象添加到同一列表中?我该怎么做


我有一个基类和三个子类,我希望所有的子类对象都在同一个列表中

Sure-只需使用基本类型作为泛型类型参数创建一个列表:

List<Control> controls = new List<Control>();
controls.Add(new TextBox());
controls.Add(new Label());
controls.Add(new Button());
// etc
如果要获取特定类型(或其子类型)的所有元素,可以使用类型的
方法:

foreach (TextBox tb in controls.OfType<TextBox>())
{
    // Use tb here
}
foreach(controls.OfType()中的文本框tb)
{
//在这里使用tb
}

如果将容器声明为一个包含指向对象的指针的列表,则可以进行向下转换,而不会出现问题,并且仍然具有多态性


将列表声明为指向基类的指针。

假设您有如下内容:

public class Base { }

public class DerivedA : Base { }
public class DerivedB : Base { }
public class DerivedC : Base { }
你可以:

List<Base> list = new List<Base>();
list.Add(new DerivedA);
list.Add(new DerivedB);
List List=新列表();
列表。添加(新的DerivedA);
列表。添加(新衍生B);

等等。

检索时,您不能再次使用
typeof()
运算符来确定控件的类型吗?我很有信心,当对象插入到其父类型的集合中时,它们不会匿名。@Aevitas:对象本身不会更改类型,但索引器的编译时类型将是基类型。因此,最后一部分是关于任何特定操作都必须向下转换到子类型。(我不认为我最终会使用
typeof
)我现在明白了,谢谢你的澄清!出于好奇,你会怎么做呢?我会想象自己做了类似于
if(o.GetType()==typeof(OurType))
的事情来找到对象的“实际”类型。我已经尝试过这个方法,它似乎是一个很好的解决方案,但当我再次需要对象时,我如何知道它们是哪种类型@萨丹:您必须进行测试-我的首选是使用
is
as
,具体取决于具体情况。或者只是一个强制转换,如果对象的类型不正确会是一个bug的话。
List<Base> list = new List<Base>();
list.Add(new DerivedA);
list.Add(new DerivedB);