C# 如何在不知道其类型的情况下将表的所有子项返回到列表?

C# 如何在不知道其类型的情况下将表的所有子项返回到列表?,c#,linq,C#,Linq,假设我有一个名为AppChartGroup的表,然后有几个子表挂在它上面,这些子表包含每种图表类型的参数。因此,可能有一个名为AppBarChart的表和一个名为AppPieChart的表,根据表的不同,每个表都有不同的参数。两者都通过ChartGroupId链接到AppChartGroup。对我来说,问题在于事情的本质。我想得到AppChartGroup上挂起的所有图表的列表,不管它们是什么类型。在min,我知道的唯一方法是: var testChartList = new List<o

假设我有一个名为AppChartGroup的表,然后有几个子表挂在它上面,这些子表包含每种图表类型的参数。因此,可能有一个名为AppBarChart的表和一个名为AppPieChart的表,根据表的不同,每个表都有不同的参数。两者都通过ChartGroupId链接到AppChartGroup。对我来说,问题在于事情的本质。我想得到AppChartGroup上挂起的所有图表的列表,不管它们是什么类型。在min,我知道的唯一方法是:

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 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);
            }
        });
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);
            }
        });

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

你确定要将它们作为
对象
?您可以为图表创建一个基类(如
ChartBase

        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);
            }
        });
如果要从单个项目获取所有图表,请执行以下操作:

var chartGroup = new ChartGroup();

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

testChartList.AddRange(chartGroup.AppBarChart);
testChartList.AddRange(chartGroup.AppPieChart);
testChartList.AddRange(chartGroup.AppLineChart);
        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);
            }
        });
var chartGroup=new chartGroup();
ListtestChartList=新列表();
AddRange(chartGroup.AppBarChart);
AddRange(chartGroup.AppPieChart);
testChartList.AddRange(chartGroup.AppLineChart);

以下内容可以满足您的需要,而不必担心类型

var testChartList = chartGroup.AppBarCharts.Cast<object>().ToList();
testChartList.AddRange(chartGroup.AppPieCharts);
testChartList.AddRange(chartGroup.AppLineCharts);
        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);
            }
        });
var testChartList=chartGroup.AppBarCharts.Cast().ToList();
testChartList.AddRange(chartGroup.AppPieCharts);
testChartList.AddRange(chartGroup.AppLineCharts);

另一种方法是使用反射。但这极有可能使系统减速

        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);
            }
        });
var m=typeof(AppChartGroup).GetProperties().ToList();
列表图表=新列表;
m、 ForEach(prop=>
{
if(prop.PropertyType.GetInterface(nameof(IEnumerable))!=null)
{
var chart=prop.GetValue(chartGroup)作为IEnumerable;
图表。添加范围(数据);
}
});

效率低于
.AddRange
,但LINQ版本应为:

        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);
            }
        });
var testChartList = chartGroup.AppBarChart.Concat(chartGroup.AppPieChart)
                                          .Concat(chartGroup.AppLineChart).ToList();
根据
chartGroup.Children
实现的内容,这可能会起作用:

        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);
            }
        });
var testChartList = chartGroup.Children.SelectMany(x => x).ToList();


你能展示chartGroup模型吗?什么是儿童类型?它们是继承某个接口还是都属于同一个类?请尝试以下操作:List charts=chartGroup.Cast().Select(x=>x.ToList();孩子们是不同类型的。它们的类型不太相关。我只想要所有的孩子,不管类型。一旦我拥有了它们,我将处理它们的类型。这取决于
chartGroup
实现了什么。
图表组的类型或定义是什么?如果这个WinForm/WPF/ASP.NET/something可能会有帮助。是的,我意识到我可以走这条路——有几种方法可以做到这一点。但是,如果我想把所有的孩子都列在一个列表中,那么不必担心他们的类型,最简单的方法是什么?也许做不到?可以做到。但这在你的情况下是不必要的。您可以通过遵循OOPS原则而不是将内容保存在对象中来改进设计。希望这有帮助。我回答了你的问题吗?你没有真正回答我的问题。我很欣赏大家的反应,我知道有更好的方法,如果可能的话,我只想用一种特殊的方法。因此,正确的答案应该是提供一种方法来做我想做的事情,或者告诉我做不到。但我仍然担心类型——我会指定“chartGroup.AppBarCharts”,我不想指定我得到的类型,我只想所有类型的子对象,不管类型如何,并放入一个对象的通用列表中。就像我说的,我想要类似“List List=AppChartGroup.Children.toList();”如果希望在不直接调用List属性的情况下动态访问类上的属性,则必须使用反射。我可以问你为什么不想单独访问每个列表吗?i、 e.chartGroup.AppBarCharts。使用foreach循环中的linq已经节省了很多钱。这只是更具可读性。。。linq基本上都是幕后操纵者。没有真正的理由我不能单独访问每个列表,我只是好奇它是否可以一次完成。看起来它应该可以工作,但它没有。当它进入“if”语句时,“var chart”为空。它没有获取类型为“prop”的图表列表。@ailinmcc666。。已经纠正了同样的错误。。。这是由于差异问题,这也不起作用。它不识别“nameof”。另外,这也不是真正的问题——它进入了“if”语句,问题是在“var-chart”中——它没有填充“var-chart”。@ailinmcc666作品名称仅来自c#6,我相信,如果您使用的是较旧的框架,您可以使用字符串“IEnumerable”。我们将图表设置为null的原因是将prop.GetValue(chartGroup)转换为List而不是IEnumerable。这是因为List类不支持协方差。谢谢。这是我所能得到的最接近我试图做的事情的答案。我接受这个。chartGroup。Children不存在。我把它作为我想做的事情的一个例子。