Универсальный метод принятия Список <T> - PullRequest
4 голосов
/ 02 декабря 2011

У меня есть 5 классов, которые представляют собой ряд сетки данных.Все эти классы наследуются от абстрактного класса CoreGrid.

У меня есть механизм экспорта, который использует отражение, чтобы выяснить столбцы для экспорта.В настоящее время у меня есть метод для каждого типа сетки (ExportOrganisations, ExportPeople, ExportEvents), однако это ужасно, поскольку единственное, что отличается между ними, это часть, где он ищет тип.Пример кода показан ниже:

public string ExportEvents(List<EventGrid> events)
{
    DataTable report = new DataTable();

    EventGrid ev = new EventGrid();

    Type t = ev.GetType();

    PropertyInfo[] props = t.GetProperties();

    foreach (PropertyInfo prop in props)
    {
        if (!prop.Name.Contains("ID"))
        {
            report.Columns.Add(prop.Name);
        }
    }

    foreach (var item in events)
    {
        DataRow dr = report.NewRow();

        Type itemType = item.GetType();

        PropertyInfo[] itemProps = itemType.GetProperties();

        foreach (PropertyInfo prop in itemProps)
        {
            if (report.Columns.Contains(prop.Name))
            {
                if (prop.GetValue(item, null) != null)
                {
                    dr[prop.Name] = prop.GetValue(item, null).ToString().Replace(",", string.Empty);
                }
            }
        }

        report.Rows.Add(dr);
    }

    return GenerateCSVExport(report, ExportType.Events);
}

Мой вопрос: как бы я сжал эти методы в один метод, где метод принимает список, который наследуется от CoreGrid?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011
public string ExportEvents<T>(List<T> events) where T : CoreGrid
{
    DataTable report = new DataTable();

    Type t = typeof(T);

    //your magic here
}

А затем используйте

var result = ExportEvents<EventGrid>(eventList);
3 голосов
/ 02 декабря 2011

Должно быть что-то вроде этого.Благодаря возможности выводить типы, вам не нужно менять текущие сигнатуры вызовов, просто укажите все на общий метод:

//if myList is a list of CoreGrid or derived.
string export = ExportEvents(myList);


public string ExportEvents<T>(List<T> events) where T : CoreGrid
{
    DataTable report = new DataTable();

    Type t = typeof(T);

    PropertyInfo[] props = t.GetProperties();

    foreach (PropertyInfo prop in props)
    {
        if (!prop.Name.Contains("ID"))
        {
            report.Columns.Add(prop.Name);
        }
    }

    foreach (var item in events)
    {
        DataRow dr = report.NewRow();

        Type itemType = item.GetType();

        PropertyInfo[] itemProps = itemType.GetProperties();

        foreach (PropertyInfo prop in itemProps)
        {
            if (report.Columns.Contains(prop.Name))
            {
        var propValue = prop.GetValue(item, null)
                if (propValue != null)
                {
                    dr[prop.Name] = propValue.ToString().Replace(",", string.Empty);
                }
            }
        }

        report.Rows.Add(dr);
    }

    return GenerateCSVExport(report, ExportType.Events);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...