Приведение общей таблицы данных к типизированной таблице данных

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

Взглянул на casting-a-base- тип-в-производный тип, но не мог понять, как это сделать.

Я не могу заполнить таблицу данных с помощью средства чтения данных, могу использовать только клиентский метод DataAccess.


person callisto    schedule 09.09.2009    source источник


Ответы (4)


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

DataTable data = GetData();
MarketValueDataTable myData = new MarketValueDataTable();
myData.Merge(data);
person Thomas Levesque    schedule 09.09.2009
comment
Сколько стоит слияние?! - person deepdive; 07.07.2015

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

VB

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)

C#

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);
person Carter Medlin    schedule 31.10.2012

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

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

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

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

(Я не проверял это)

person Tor Haugen    schedule 09.09.2009

Если ваша таблица данных является общей таблицей, ее нельзя преобразовать в 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);

}

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

person Rune Grimstad    schedule 09.09.2009