如何在不知道类型的情况下获取表格的所有孩子,并返回列表?

问题描述:

假设我有一个名为AppChartGroup的表,然后悬挂了几个子表,它们包含每种类型图表的参数。所以可能有一个名为AppBarChart的表和一个名为AppPieChart的表,每个表具有不同的参数,具体取决于表。都通过ChartGroupId链接到AppChartGroup。对我来说问题在于C#方面。我想获得挂在AppChartGroup上的所有图表的列表,不管它们是什么类型。在分钟,我知道这样做的唯一方法是这样的:如何在不知道类型的情况下获取表格的所有孩子,并返回列表?

var testChartList = new List<object>(); 

foreach (var barChart in chartGroup.AppBarChart) 
{ 
    testChartList.Add(barChart); 
} 

foreach (var pieChart in chartGroup.AppPieChart) 
{ 
    testChartList.Add(pieChart); 
} 

foreach (var lineChart in chartGroup.AppLineChart) 
{ 
    testChartList.Add(lineChart); 
} 

当然必须有这样做的更雄辩想要什么?沿着线的东西:

var testChartList = new List<object>(); 

foreach (var childChart in chartGroup.Children) 
{ 
    testChartList.Add(childChart); 
} 

但怀疑这是比更容易,LINQ的可能是一条线做工作,可惜我不是在LINQ太好。有没有人知道这样做更有效率或更好的方式?

编辑

非常基本的模型。

 AppChartGroup 
     |  |  | 
     |  |  | 
BarChart PieChart LineChart 

EDIT2

顺便说一句,我知道,我要问是不可能的 - 我只是询问是否可能的,但如果你不认为那么,请不要犹豫告诉我。

+0

可以显示chartGroup模式? – CPR43

+1

什么是孩子的类型?他们是否继承了一些界面,或者他们都是同一类? – Nino

+0

尝试类似这样的:列表 charts = chartGroup.Cast ().Select(x => x).ToList(); – jdweng

另一种方法是使用反射。但是这个系统放缓的可能性很高。

 var m = typeof (AppChartGroup).GetProperties().ToList(); 
     List<object> charts= new List<Object>; 
     m.ForEach(prop => 
     { 
      if (prop.PropertyType.GetInterface(nameof(IEnumerable)) !=null) 
      { 
       var chart= prop.GetValue(chartGroup) as IEnumerable<object>;    
       charts.AddRange(data); 
      } 
     }); 
+0

似乎它应该工作,但它不。当它在'if'语句内进行时,'var chart'为空。它没有得到'prop'类型的图表列表。 – ailinmcc666

+0

@ ailinmcc666 ..已纠正相同...这是由于方差问题 – CPR43

+0

这也不起作用。它不承认“nameof”。此外,这不是真正的问题 - 它进入'if'语句,它是'var chart',问题是 - 它不是填充'var chart'。 – ailinmcc666

您确定要将它们保存为object?如果你想从一个单一的项目取得的所有图表,你可以有图表基类(像ChartBase

var chartGroup = new ChartGroup(); 

List<ChartBase>testChartList = new List<ChartBase>(); 

testChartList.AddRange(chartGroup.AppBarChart); 
testChartList.AddRange(chartGroup.AppPieChart); 
testChartList.AddRange(chartGroup.AppLineChart); 
+0

是的,我意识到我可以走这条路 - 有几种方法可以做到这一点。但是,如果我只想列入清单,获得所有孩子的最简单方法是什么,而不必担心它们的类型?也许它不能完成? – ailinmcc666

+0

它可以做到。但在你的情况下并不是必需的。您可以通过遵循OOPS原则而不是将东西放在对象中来改善设计。希望这可以帮助。 –

+0

我回答你的问题了吗? –

以下应该做你需要的东西,而不用担心类型。

var testChartList = chartGroup.AppBarCharts.Cast<object>().ToList(); 
testChartList.AddRange(chartGroup.AppPieCharts); 
testChartList.AddRange(chartGroup.AppLineCharts); 
+0

但我仍然担心类型 - 我会指定'chartGroup.AppBarCharts'我不想指定我得到的类型,我只是希望所有类型的孩子,不管类型,并放入一个对象的通用列表。就像我说的,我想要像'列表列表= AppChartGroup.Children.toList();' – ailinmcc666

+0

如果你想动态访问一个类的属性而不直接调用List属性,那么你将不得不使用反射。我可以问为什么你不想单独访问每个列表?即chartGroup.AppBarCharts。你已经使用foreach循环中的linq节省了很多。这只是更具可读性......无论如何,linq几乎都是引擎盖下的foreach。 – Wheels73

+0

没有真正的理由不能单独访问每个列表,我只是好奇它是否可以一次完成。 – ailinmcc666

.AddRange效率较低,但LINQ的版本应该是:

var testChartList = chartGroup.AppBarChart.Concat(chartGroup.AppPieChart) 
              .Concat(chartGroup.AppLineChart).ToList(); 

根据什么chartGroup.Children工具,这可能工作:

var testChartList = chartGroup.Children.SelectMany(x => x).ToList(); 
+0

chartGroup.Children不存在。我正在使用它作为我想要做的一个例子。 – ailinmcc666