如何从抽象类列表中检索派生类?

时间:2016-03-23 03:47:19

标签: c# asp.net asp.net-mvc-5

我有一个显示几种小部件类型的应用程序。我将视图传递给基础抽象类GraphWidget。目标是遍历这些,并为每种类型的图形创建适当的显示。

我如何循环遍历该集合并从派生类中获取适当的信息,以便我的视图知道如何呈现每个小部件?

编辑这是一个.NET MVC5应用程序

示例代码:

public abstract class GraphWidget {
    public abstract string Display();
    public string Title {get; set;}
    public GraphWidget(string title){
        this.Title = title;
    }
}

public class BarGraph : GraphWidget{
     public override string Display(){
          return stuff...
     }
}

因此,例如,如果我混合使用条形图和饼图,它们的Display()函数将会有所不同。我想在我的剃刀视图中确保接受IEnumerable,我可以正确显示每个项目。

2 个答案:

答案 0 :(得分:2)

您可以使用" is"运算符来测试GraphWidgets是否属于某个派生类:

    var graphs = new List<GraphWidget>{new BarGraph("Bar"), new PieGraph("Pie")};
    foreach(var graph in graphs)
    {
       if (graph is BarGraph)
          { // it's a BarGraph 
          }
       else if (graph is PieGraph)
          { // it's a PieGraph 
          }
    }

如果您需要将它们用作派生类,那么您可以使用&#34; as&#34;运营商:

    /* Note: if graph is actually of type PieGraph, 
             then barGraph would be null */
    var barGraph = graph as BarGraph; 

答案 1 :(得分:2)

据我了解,您可以使用LINQ方法OfType

var list = new List<GraphWidget>();
var badList = list.OfType<BarGraph>().ToList();