Получить списки столбцов из неуниверсального IEnumerable с помощью Reflection - PullRequest
0 голосов
/ 09 мая 2019

У меня есть метод, который принимает общий IEnumerable и генерирует списки уникальных значений для каждого столбца. Излишне говорить, что это очень медленно, я предполагаю, что это из-за всех используемых отражений. Вот пример кода:

private void PopulateReferenceMatrices(IEnumerable newValue)
    {
        Type t = newValue.GetType();
        Type baseType = t.GetGenericArguments()[0];
        PropertyInfo[] properties;
        Dictionary<string, int> indexValues = new Dictionary<string, int>();
        properties = baseType.GetProperties();
        int numProperties = properties.Count(); 
        ListValues = new List<object>[numProperties];
        for (int i = 0; i < numProperties; i++)
        {
            indexValues.Add(properties[i].Name, i);
            FilterValues[i] = new List<object>();
        }
        //populate values into array
        foreach (dynamic da in newValue)
        {
            foreach (PropertyInfo d in properties)
            {
                Object property = d.GetValue(da);
                ListValues[indexValues[d.Name]].Add(property);
            }
        }
    }

Могу ли я сгенерировать список значений для каждого свойства без прохождения строки IEnumerable за строкой и приведения каждого свойства к объекту?

Есть ли более быстрый способ сделать что-то подобное для каждого элемента в IEnumerable?:

public IList getRowValue(IEnumerable value, string propertyName)
{
    value.Select(x => x.propertyName).ToList();

}

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Одна из возможных проблем заключается в том, что вы передаете неуниверсальную коллекцию, которая может быть различными объектами, поэтому создайте propertyInfo в цикле, чтобы убедиться, что вы можете прочитать это свойство из объекта.Если вы уверены, что все объекты в неуниверсальной коллекции имеют одинаковый тип, вы можете прочитать propertyInfo вне цикла из первого объекта в списке (если он имеет хотя бы один экземпляр).

Вы можете попробовать это, см. Комментарии к коду:

public static IList GetRowValue(IEnumerable value, string propertyName)
{
    // create an arraylist to be the result
    var result = new ArrayList();

    // loop in the objects
    foreach (var item in value)
    {
        // search for a property on the type of the object
        var property = item.GetType().GetProperty(propertyName);

        // if the property was found
        if (property != null)
        {
            // read the property value from the item
            var propertyValue = property.GetValue(item, null);

            // add on the result
            result.Add(propertyValue);
        }
    }

    return result;
}

См. Рабочий образец с различными объектами в коллекциях: https://dotnetfiddle.net/bPgk4h

0 голосов
/ 15 мая 2019

Проблема не имеет ничего общего с IEnumerable или отражением.Данные не были заполнены в IEnumerable, поэтому он делал тысячи обращений к базе данных, а я заполнял матрицу.После устранения этой проблемы он загружается в кратчайшие сроки.

...