Получить имя свойства, нужно получить только определенные столбцы - PullRequest
0 голосов
/ 10 февраля 2012

Краткое содержание ответа:

Решено, используя ответ Джона Скита ниже.Вот готовый код

    public static CSVData CreateCSVData(List<RegDataDisplay> rList, 
                                                         string[] selectors)
    {
        CSVData csv = new CSVData(); // Create the CSVData object
        foreach(string selector in selectors)
        {
            // Get the PropertyInfo for the property whose name
            // is the value of selector
            var property = typeof(RegDataDisplay).GetProperty(selector); 

            // Use LINQ to get a list of the values for the specified property
            // of each RegDataDisplay object in the supplied list.
            var values = rList.Select(row => property.GetValue(row, null)
                              .ToString());

            // Create a new list with the property name to use as a header
            List<string> templs = new List<string>(){selector};

            // Add the returned values after the header 
            templs.AddRange(values);

            // Add this list as a column for the CSVData object.
            csv.Columns.Add(templs);
        }
        return csv;
    }

Вопрос

Я строю свой SQL-запрос динамически из пользовательского ввода, а затем экспортирую результаты в файл CSV.У меня есть класс с именем RegDataDisplay, который имеет свойство для каждого из возможных столбцов, возвращаемых моим запросом.Я могу сказать, какие столбцы выбираются, но в моем создателе CSV мне нужно иметь возможность выводить только эти конкретные столбцы.

В приведенном ниже примере все полученные данные находятся в rList, а именаиз свойств мне нужно в селекторах.Поэтому я хочу перебрать список и затем добавить только те свойства, которые мне нужны, к моим данным CSV.

public static CSVData CreateCSVData(List<RegDataDisplay> rList, string[] selectors)
{ 
    CSVData csv = new CSVData();
    for(int i = 0; i < selectors.Length; i++)
    {
        csv.Columns.Add(new List<string>(){selectors[i]});
    }

    // So now I have the headers for the CSV columns, 
    // I need the specific properties only which is where I'm stuck

    for(int i = 0; i < selectors.Length; i++)
    {
        for(int j = 0; j < rList.Count; j++)
        {
            // If it was javascript I would do something like this 

            csv.Columns[i].Add(rList[j][selectors[i]]);

        } 
    }
}

Спасибо

РЕДАКТИРОВАТЬ: сейчас на правильном пути, но я идус ошибкой «Объект не соответствует типу цели».

    public static CSVData CreateCSVData()
    {
        // I've created a test method with test data

        string[] selectors = new string[] { "Firstname", "Lastname" };
        List<RegDataDisplay> rList = new List<RegDataDisplay>();
        RegDataDisplay rd = new RegDataDisplay();
        rd.Firstname = "first";
        rd.Lastname = "last";
        rList.Add(rd);

        CSVData csv = new CSVData();
        foreach(string selector in selectors)
        {
            var property = typeof(RegDataDisplay).GetProperty(selector);
            var values = rList.Select(row => property.GetValue(rList, null).ToString())
                              .ToList(); // Error throws here
            csv.Columns.Add(values);
        }
        return csv;
    }

1 Ответ

2 голосов
/ 10 февраля 2012

Предполагается, что вы используете .NET 3.5 или выше, похоже, что вам может понадобиться что-то вроде:

public static CSVData CreateCSVData(List<RegDataDisplay> rList,
                                    string[] selectors)
{ 
    CSVData csv = new CSVData();
    foreach (string selector in selectors)
    {
        var prop = typeof(RegDataDisplay).GetProperty(selector);
        var values = rList.Select(row => (string) prop.GetValue(row, null))
                          .ToList();
        csv.Columns.Add(values);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...