Кастинг, общий тип данных для типизированных данных
Мне нужно повторно использовать метод 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);
}
Вы получаете общую идею. Пройдите по строкам общей таблицы и используйте отражение, чтобы найти соответствующие свойства в определенной строке данных. Это должно работать (раньше я использовал тот же подход), но код должен быть изменен в соответствии с вашими требованиями.