Как я могу сделать этот дополнительный метод более универсальным?

У меня есть заскок, пытающийся сделать следующий метод более универсальным таким образом что любой List<T> может быть передан в для columnValues параметр. Вот то, что я имею:

public static DataRow NewRow(this DataTable dataTable, List<string> columnValues)
{
    DataRow returnValue = dataTable.NewRow();

    while (columnValues.Count > returnValue.Table.Columns.Count)
    {
        returnValue.Table.Columns.Add();
    }

    returnValue.ItemArray = columnValues.ToArray();
    return returnValue;
}

Я мог изменить его на a List<object> и преобразуйте исходный список до передачи его к методу, но я уверен, что существует более оптимальный вариант :-)

Править:

Сообщение Frank's заставило меня заново продумать это. В большинстве случаев тот источник List<T> был бы a List<object> так как значения столбцов, скорее всего, будут различными типами.

Для моего начального использования a List<string> имевший смысл, потому что я создавал набор данных из синтаксического анализа CSV, который является всем текстом в той точке.

6
задан Cory Charlton 4 March 2010 в 00:09
поделиться

4 ответа

Вам в основном не повезло, потому что Item Array в DataRow представляет собой массив объектов, то есть в конечном итоге вы можете передать только список объектов.

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

Сказав, что для получения множества столбцов, все с разными типами, вы можете изменить свой метод расширения, чтобы он принимал объект, в котором вы создаете экземпляр анонимного типа:

table.NewRow(new  { A = "Hello", B = 1, C = DateTime.Now })

С помощью преобразования значений анонимного типа в строковый, объектный словарь путем отражения или динамического метода должен быть довольно полезной вещью.

4
ответ дан 9 December 2019 в 20:43
поделиться

Почему бы просто не использовать объект params []:

public static DataRow NewRow(this DataTable dataTable, params object[] objects)
{
    DataRow returnValue = dataTable.NewRow();

    while (objects.Length > returnValue.Table.Columns.Count)
    {
        returnValue.Table.Columns.Add();
    }

    returnValue.ItemArray = objects;
    return returnValue;
}

Тогда вы можете просто назвать его так:

myDataTable.NewRow(1,2,"hello");
5
ответ дан 9 December 2019 в 20:43
поделиться

А как насчет

IEnumerable<object>

в связи с

columnValues.Select(x => x.ToString()).ToArray();
2
ответ дан 9 December 2019 в 20:43
поделиться

Как насчет использования замыкания для указания способа генерации ItemArray на основе вашего типа ввода

public static DataRow NewRow<T>(this DataTable dataTable, List<T> columnValues, Func<T, string> itemArrayCriteria)
{
    DataRow returnValue = dataTable.NewRow();

    while (columnValues.Count > returnValue.Table.Columns.Count)
    {
        returnValue.Table.Columns.Add();
    }

    returnValue.ItemArray = columnValues.Select(x => itemArrayCriteria(x)).ToArray();
    return returnValue;
}
1
ответ дан 9 December 2019 в 20:43
поделиться