В абстрактном классе ( C # 3 ) существует виртуальный метод с именем GetData
, который возвращает DataTable. Алгоритм метода следующий:
- Получить строку SQL-запроса из класса.
- Получить DataTable из базы данных, используя вышеуказанный запрос.
- Выполнить преобразования в DataTable и вернуть его.
В 3-м пункте я клонирую исходную таблицу данных, чтобы изменить тип столбца (я не могу сделать это для заполненной таблицы и не могу установить это во 2-й точке) и перечисляю каждую строку, в которую я копирую и преобразовать данные из исходного. Преобразования зависят от класса, у каждого есть закрытые методы, которые самостоятельно преобразуют данные.
Вопрос заключается в следующем: как создать метод в базовом классе, который будет основан на следующих трех параметрах: имя столбца, который будет преобразован, тип нового столбца и действие во время преобразования. Два первых довольно просты, но я не уверен насчет третьего. Я думал о разработке нового класса, который будет хранить эти три параметра, а действие будет сохранено как следующий делегат:
public delegate object Convert(object objectToConvert);
Преобразование будет выглядеть примерно так:
int rowCounter = 0;
foreach(DataRow row in dt.Rows)
{
foreach(var item in Params)
{
row[item.ColumnIndex] = item.Convert(originalDataTable.Rows[rowCounter].ItemArray[item.ColumnIndex]);
}
++rowCounter;
}
На данный момент я должен переопределить метод GetData()
в каждом классе, в котором я хочу иметь преобразования, которые вызывают большое дублирование кода. Цель, которую я хочу достичь, - создать базовый класс, который будет основан на параметрах, которые я упомянул выше. Вышеупомянутое решение хорошо для этой проблемы, или это любой другой способ сделать это?