将通用的datatable转换为具有类型的datatable

17
我需要重用客户端规定的DataAccess方法。这个方法返回一个普通的数据表格。 我想将这个数据表格强制转换为我的Typed数据表格,列的数量和它们的类型会匹配。 异常消息"无法将类型为'System.Data.DataTable'的对象强制转换为类型'MarketValueDataTable'"非常清晰,但我该如何解决呢?
看了一下casting-a-base-type-to-a-derived-type,但是没有看到如何使其工作。
我不能使用数据读取器来填充数据表格,只能使用客户端的DataAccess方法。
4个回答

36

只有当方法返回的表实际上是 MarketValueDataTable 的实例时,强制转换才能起作用。如果不是这样,你只能将数据复制到 MarketValueDataTable 的实例中。例如,你可以使用 Merge 方法:

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

合并的成本是多少?! - deepdive

8
使用这个便捷的函数将普通的 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);

1

你不能将 DataTable 强制转换为 MarketValueDataTable,因为它并没有继承自它。

你需要做的是实例化一个新的 MarketValueDataTable,然后将 DataTable 中的数据复制到其中。

可以尝试以下代码:

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

(我还没有测试过这个)

0
如果您的datatable是一个通用表,则无法将其转换为MarketValueDataTable。
您可以尝试的一件事是创建一个新的MarketValueDataTable对象,并手动向其中添加行。通过遍历通用datatable的行,然后遍历每行的列,您可以使用反射来设置新的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);

}

你大概有个想法。遍历通用表的行,并使用反射在特定类型的数据行中查找匹配的属性。这应该可以工作(我之前也使用过相同的方法),但代码必须修改以符合你的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接