Кастинг, общий тип данных для типизированных данных

Мне нужно повторно использовать метод DataAccess, предписанный клиентом. Этот метод возвращает ванильный datatable. Я хочу, чтобы этот тип данных был привязан к моему типизированному типу данных. Количество столбцов и их типы будут совпадать. Сообщение об исключении "Невозможно наложить объект типа" System.Data.DataTable "на тип" MarketValueDataTable "."  очень ясно, но как я могу это исправить?

Посмотрел casting-a-base-type-to-a-derived-type, но не мог понять, как это сделать.

Я не могу заполнить datatable с помощью datareader, может использовать только метод DataAccess клиента.

Ответы

Ответ 1

Приведение может работать только в том случае, если таблица, возвращаемая методом, фактически является экземпляром MarketValueDataTable. Если это не так, все, что вы можете сделать, это скопировать данные в экземпляр MarketValueDataTable. Например, вы можете использовать метод Merge:

DataTable data = GetData();
MarketValueDataTable myData = new MarketValueDataTable();
myData.Merge(data);

Ответ 2

Используйте эту удобную функцию для преобразования регулярного DataTable в набранный DataTable.

В. Б.

Public Shared Function ConvertToTypedDataTable(Of T As {Data.DataTable, New})(dtBase As Data.DataTable) As T
    Dim dtTyped As New T
    dtTyped.Merge(dtBase)

    Return dtTyped
End Function

Использование

Dim dtTyped = ConvertToTypedDataTable(Of dataset1.MyTypedDataTable)(MyUntypedDataTable)

С#

public static T ConvertToTypedDataTable<T>(System.Data.DataTable dtBase) where T : Data.DataTable, new()
{
    T dtTyped = new T();
    dtTyped.Merge(dtBase);

    return dtTyped;
}

Использование

dataset1.MyTypedDataTable dtTyped = ConvertToTypedDataTable<dataset1.MyTypedDataTable>(MyUntypedDataTable);

Ответ 3

Вы не можете применить DataTable к MarketValueDataTable по той простой причине, что он не наследует от него.

Что вам нужно сделать, это создать экземпляр нового MarketValueDataTable, а затем скопировать данные из DataTable в него.

Попробуйте что-то вроде:

MarketValueDataTable myTable = new MarketValueDataTable();
StringWriter writer = new StringWriter();
theDataTable.WriteXml(writer);
myTable.ReadXml(new StringReader(writer.ToString()));

(я не тестировал это)

Ответ 4

Если ваш datatable является общей таблицей, он не может быть передан в MarketValueDataTable.

Можно попытаться создать новый объект MarketValueDataTable и вручную добавить к нему строки. Перейдя по строкам вашего общего типа данных, а затем перейдя через столбцы каждой строки, вы можете использовать отражение, чтобы установить значения свойств нового MarketValueDataTableRow.

Что-то вроде следующего (предупреждение - псевдокод):

MarketValueDataTable mv = new MarketValueDataTable();
foreach(DataRow row in table.Rows)
{

   MarketValueDataTableRow mvrow = mv.NewRow();
   foreach(DataColumn col in table.Columns)
   {
      PropertyInfo colProperty = mvrow.GetType().GetProperty(col.Name);
      colProperty.SetValue(mvRow, row[col]);
   }
   mv.Rows.Add(mvrow);

}

Вы получаете общую идею. Пройдите по строкам общей таблицы и используйте отражение, чтобы найти соответствующие свойства в определенной строке данных. Это должно работать (раньше я использовал тот же подход), но код должен быть изменен в соответствии с вашими требованиями.