Получить свойства объекта по ключам. NET Core и поместить в другой объект - PullRequest
2 голосов
/ 17 июня 2020

У меня есть пустой var filters = new Ranges(); объект, который имеет такие свойства, как:

 public class Ranges
{
    public double[] NumberOfCustomers { get; set; }

    public int[] NumberOfTransactions { get; set; }
    // ... more properties....
 }

каждое свойство в этом объекте должно иметь два значения: min и max, которые я получаю через запрос sql. Поскольку я получаю все минимальные / максимальные значения в одном запросе, я помещаю их в объект, результаты которого выглядят так:

enter image description here

для каждого ключа есть два значения и я хочу добавить им два соответствующих массива в свойствах Ranges:

вот как я это пробую:

            var filters = new Ranges();
            PropertyInfo[] properties = typeof(Ranges).GetProperties();
            foreach (PropertyInfo property in properties)
            {
                var title = property.Name;
                var a = rangeTask.Result; // IEnumerable<object>
                PropertyInfo pi = a.GetType().GetProperty(title);
                var value = pi.GetValue(a, null);
                property.SetValue(filters, value); // property of Ranges
            }

, однако получаемое мной значение равно null. Что я делаю не так? Как мне получить эти значения?

1 Ответ

1 голос
/ 17 июня 2020

В вашем коде несколько ошибок. Предполагая, что на вашем снимке экрана отображается rangeTask.Result, вы можете попробовать сделать что-то вроде этого:

var filters = new Ranges();
var a = new[] {KeyValuePair.Create("NumberOfCustomers", (object)0.0), KeyValuePair.Create("NumberOfCustomers", (object)100.0)}; // rangeTask.Result
PropertyInfo[] properties = typeof(Ranges).GetProperties();
foreach (PropertyInfo property in properties)
{
    var title = property.Name;
    // get values by title 
    var values = a.Where(kvp => kvp.Key == title)
        .Select(kvp => kvp.Value)
        .OrderBy(v => v)
        .ToArray(); 

    // convert object[] to property type array
    var arr = Array.CreateInstance(property.PropertyType.GetElementType(), values.Length); 
    Array.Copy(values, arr, values.Length);

    // assign array
    property.SetValue(filters, arr); // property of Ranges
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...