我有一个包含3个List集合的类,如下所示。
我正在尝试使用一个逻辑来迭代对象的“集合” 属性并使用存储在这些集合中的数据执行某些操作。
我只是想知道是否有一种使用foreach的简单方法。 感谢
public class SampleChartData
{
public List<Point> Series1 { get; set; }
public List<Point> Series2 { get; set; }
public List<Point> Series3 { get; set; }
public SampleChartData()
{
Series1 = new List<Point>();
Series2 = new List<Point>();
Series3 = new List<Point>();
}
}
答案 0 :(得分:11)
获取所有IEnumerable&lt; T&gt;的函数来自对象:
public static IEnumerable<IEnumerable<T>> GetCollections<T>(object obj)
{
if(obj == null) throw new ArgumentNullException("obj");
var type = obj.GetType();
var res = new List<IEnumerable<T>>();
foreach(var prop in type.GetProperties())
{
// is IEnumerable<T>?
if(typeof(IEnumerable<T>).IsAssignableFrom(prop.PropertyType))
{
var get = prop.GetGetMethod();
if(!get.IsStatic && get.GetParameters().Length == 0) // skip indexed & static
{
var collection = (IEnumerable<T>)get.Invoke(obj, null);
if(collection != null) res.Add(collection);
}
}
}
return res;
}
然后你可以使用像
这样的东西var data = new SampleChartData();
foreach(var collection in GetCollections<Point>(data))
{
foreach(var point in collection)
{
// do work
}
}
遍历所有元素。
答案 1 :(得分:1)
使用Reflection获取对象属性。然后迭代这些以查看is IEnumerable<T>
。然后迭代IEnumerable属性
答案 2 :(得分:0)
您可以使用反射来获取对象的属性列表。此示例获取所有属性并将其名称和Count打印到控制台:
public static void PrintSeriesList()
{
SampleChartData myList = new SampleChartData();
PropertyInfo[] Fields = myList.GetType().GetProperties();
foreach(PropertyInfo field in Fields)
{
var currentField = field.GetValue(myList, null);
if (currentField.GetType() == typeof(List<Point>))
{
Console.WriteLine("List {0} count {1}", field.Name, ((List<Point>)currentField).Count);
}
}
}
答案 3 :(得分:0)
刚刚找到了一个快速解决方案,但也许你们中的一些人有更好的方法。 这就是我所做的。
SampleChartData myData = DataFeed.GetData();
Type sourceType = typeof(SampleChartData);
foreach (PropertyInfo pi in (sourceType.GetProperties()))
{
if (pi.GetValue(myData, null).GetType() == typeof(List<Point>))
{
List<Point> currentSeriesData = (List<Point>)pi.GetValue(myData, null);
// then do something with the data
}
}