C #, получить все свойства коллекции от объекта - PullRequest
4 голосов
/ 11 июня 2010

У меня есть класс с 3 коллекциями списков, как показано ниже.

Я пытаюсь создать логику, которая будет перебирать «коллекцию» объекта свойства и выполнить некоторые операции с использованием данных, хранящихся в этих коллекциях.

Мне просто интересно, есть ли простой способ сделать это, используя 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>();
        }
    }

Ответы [ 4 ]

11 голосов
/ 11 июня 2010

Функция для получения всех IEnumerable от объекта:

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 голос
/ 11 июня 2010

Используйте Reflection, чтобы получить свойства объектов. Затем итерируйте их, чтобы увидеть is IEnumerable<T>. Затем переберите все свойства IEnumerable

0 голосов
/ 11 июня 2010

Только что нашли быстрое решение, но, возможно, у некоторых из вас есть лучшие способы сделать это. это то, что я сделал.

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
    }
}
0 голосов
/ 11 июня 2010

Вы можете использовать отражение, чтобы получить список свойств объекта.Этот пример получает все свойства и выводит их имя и счетчик на консоль:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...