【问题标题】:Accessing the derived class object inside a base classed list访问基类列表中的派生类对象
【发布时间】:2015-02-12 13:45:50
【问题描述】:

假设我有 3 个课程:

class Geometry
{ ... }

class Line : Geometry
{ ... }

class Circle : Geometry
{ ... }

我想将LineCircle 类的所有对象放入一个通用列表中,如下所示:

List<Geometry> list = new List<Geometry>();
Line line = new Line();
Circle circle = new Circle();
list.Add(line);
list.Add(circle);

我的问题是允许这样做吗?是否仍然可以像这样从列表中检索派生类:

Line newLine = (Line)list[0];
Circle newCircle = (Circle)list[1];

如果没有,那么有没有一种好方法可以将所有这些不同类型的对象存储在同一个列表下?

【问题讨论】:

  • 允许使用,没问题。

标签: c# list inheritance


【解决方案1】:

这个怎么样:

List<Geometry> list = new List<Geometry>(); 
Geometry line = new Line(); 
Geometry circle = new Circle(); 
list.Add(line); 
list.Add(circle);

在获取时使用OfType() 获取所需的类型对象:

List<Line> lines = list.OfType<Line>().ToList(); // get lines
List<Circle> circles = list.OfType<Circle>().ToList(); // get circles

【讨论】:

  • OfType() 返回一个 IEnumerable 而不是一个列表。这不会编译:)
【解决方案2】:

当然,您可以以这种方式存储它们。因为你所有的对象都有一个共同的基础,Geometry 对象,这很好。

然后,当您从列表中检索它们时,我建议您使用 as 运算符,如下所示:

Line newLine = list[0] as Line;

我建议这样做,因为正如 MSDN 中所述:

as 运算符类似于强制转换操作。但是,如果转换不是 可能,因为返回 null 而不是引发 例外。考虑以下示例:

【讨论】:

    【解决方案3】:

    是的,这是允许的,因为 LineCircleGeometry

      List<Geometry> list = new List<Geometry>() {
        new Line(),
        new Circle()
      };
    

    如果GeometryLineCircle 等,您宁愿检查

      Line newLine = list[0] as Line;       // Line instance or null
      Circle newCircle = list[1] as Circle; // Circle instance or null
    

    要提取所有,比如说,Line 使用 Linq:

      List<Line> lines = list.OfType<Line>().ToList();
    

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多