2009-09-09 11 views
15

クライアントが規定したDataAccessメソッドを再利用する必要があります。このメソッドは、バニラデータテーブルを返します。 このデータテーブルをTypedデータテーブルにキャストしたいと思います。列の数と型が一致します。 例外メッセージ "タイプ 'System.Data.DataTable'のオブジェクトを 'MarketValueDataTable'と入力することができません。" は非常に明確ですが、どうすれば修正できますか?一般的なデータテーブルから型付きデータテーブルへのキャスト

casting-a-base-type-to-a-derived-typeを見たことがありますが、その作業を行う方法がわかりませんでした。

datatableをデータテーブルに読み込むことはできません。クライアントのDataAccessメソッドのみを使用できます。

答えて

32

(私はこれをテストしていません)

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

のようなものを試してみてください。そうでない場合は、データをMarketValueDataTableのインスタンスにコピーするだけです。あなたのDataTableは、一般的なテーブル、それはMarketValueDataTableにキャストできない場合には

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

私はSO LUV!おかげさまで – callisto

+0

非常に良い.. :) – Marshal

+0

マージのコストは何ですか? – deepdive

1

DataTableをMarketValueDataTableにキャストすることはできません。なぜなら、そのデータテーブルを継承しないという理由だけです。

新しいMarketValueDataTableをインスタンス化し、DataTableからそのデータをコピーします。メソッドによって返されたテーブルは、実際にMarketValueDataTableのインスタンスだった場合、キャストだけ仕事ができる

0

:あなたは、インスタンスのMerge方法を使用することができます。

新しい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); 
関連する問題