2009-09-09 42 views
15

我需要重用客戶端指定的DataAccess方法。這個方法返回一個香草數據表。 我想將這個數據錶轉換爲我的Typed數據表。列的數量和類型將匹配。 異常消息「無法投射'System.Data.DataTable'類型的對象來鍵入'MarketValueDataTable'。」 非常明確,但我該如何解決?將通用數據轉換爲鍵入數據表

看看casting-a-base-type-to-a-derived-type,但看不出如何使這項工作。

我無法用datareader填充數據表,只能使用客戶端的DataAccess方法。

回答

32

如果該方法返回表竟是MarketValueDataTable實例演員才能奏效。如果不是,則只需將數據複製到MarketValueDataTable的實例即可。你可以例如使用Merge方法:

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

我LUV SO! 謝謝。 – callisto 2009-09-09 10:15:06

+0

很好.. :) – Marshal 2011-04-28 12:42:46

+0

合併的成本是多少? – deepdive 2015-07-07 05:56:44

1

您不能將DataTable轉換爲MarketValueDataTable,原因很簡單,它不會從它繼承。

您需要做的是實例化一個新的MarketValueDataTable,然後將數據從DataTable複製到它。

嘗試類似:

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

(我沒有測試過這一點)

0

如果你的數據表是一個普通的表,然後它不能被轉換爲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); 

} 

你得到的總體思路。遍歷泛型表的行並使用反射來查找特定類型數據行中的匹配屬性。這應該工作(我以前使用過相同的方法),但必須修改代碼以符合您的要求。

7

使用此便利功能將常規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);