如何在不知道类型的情况下获取表格的所有孩子,并返回列表?
假设我有一个名为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
顺便说一句,我知道,我要问是不可能的 - 我只是询问是否是可能的,但如果你不认为那么,请不要犹豫告诉我。
另一种方法是使用反射。但是这个系统放缓的可能性很高。
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);
}
});
似乎它应该工作,但它不。当它在'if'语句内进行时,'var chart'为空。它没有得到'prop'类型的图表列表。 – ailinmcc666
@ ailinmcc666 ..已纠正相同...这是由于方差问题 – CPR43
这也不起作用。它不承认“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);
是的,我意识到我可以走这条路 - 有几种方法可以做到这一点。但是,如果我只想列入清单
它可以做到。但在你的情况下并不是必需的。您可以通过遵循OOPS原则而不是将东西放在对象中来改善设计。希望这可以帮助。 –
我回答你的问题了吗? –
以下应该做你需要的东西,而不用担心类型。
var testChartList = chartGroup.AppBarCharts.Cast<object>().ToList();
testChartList.AddRange(chartGroup.AppPieCharts);
testChartList.AddRange(chartGroup.AppLineCharts);
但我仍然担心类型 - 我会指定'chartGroup.AppBarCharts'我不想指定我得到的类型,我只是希望所有类型的孩子,不管类型,并放入一个对象的通用列表。就像我说的,我想要像'列表
如果你想动态访问一个类的属性而不直接调用List属性,那么你将不得不使用反射。我可以问为什么你不想单独访问每个列表?即chartGroup.AppBarCharts。你已经使用foreach循环中的linq节省了很多。这只是更具可读性......无论如何,linq几乎都是引擎盖下的foreach。 – Wheels73
没有真正的理由不能单独访问每个列表,我只是好奇它是否可以一次完成。 – ailinmcc666
比.AddRange
效率较低,但LINQ的版本应该是:
var testChartList = chartGroup.AppBarChart.Concat(chartGroup.AppPieChart)
.Concat(chartGroup.AppLineChart).ToList();
根据什么chartGroup.Children
工具,这可能工作:
var testChartList = chartGroup.Children.SelectMany(x => x).ToList();
chartGroup.Children不存在。我正在使用它作为我想要做的一个例子。 – ailinmcc666
可以显示chartGroup模式? – CPR43
什么是孩子的类型?他们是否继承了一些界面,或者他们都是同一类? – Nino
尝试类似这样的:列表 charts = chartGroup.Cast ().Select(x => x).ToList(); –
jdweng