前回に引き続き、今回はDataRowに用意された拡張メソッドについて記述します。
.NET Framework 3.5になって、DataRowに以下の拡張メソッドが用意されました。
* Field
* SetField
尚、これらの拡張メソッドは、System.Data.DataRowExtensionsクラスに定義されています。
上記の拡張メソッドによって、別段新しい機能が追加されるわけではありません。
上記の拡張メソッド達は、以下のようにして使用します。
DataRow row = table.NewRow(); row.SetField("COL-1", 100); int val1 = row.Field ("COL-1");
つまり、フィールドの読み取り処理が型セーフになったという事になります。
今までは、
int val1 = (int) row["COL-1"];
のように、キャストが必要だった部分がなくなったって感じです。
これも、前回の拡張メソッドと同様に主にLinqで利用するために追加されたメソッドです。
Linqで処理を行う際に
where ((int) row["COL-1"]) >= 100
と書くよりも
where row.Field("COL-1") >= 100
と書ける方が記述性がいいです。
この拡張メソッド、当然普段の処理でも利用できます。
また、DataRowVersionを指定するタイプのオーバーロードも当然用意されています。
以下、サンプルです。
#region DataTableExtensionsSample-02
public class DataTableExtensionsSample02 : IExecutable{
public void Execute(){
DataTable table = BuildSampleTable();
//
// 1列目の情報をint型で取得.
// 2列目の情報をstring型で取得.
//
int val1 = table.Rows[0].Field("COL-1");
string val2 = table.Rows[0].Field("COL-2");
PrintTable("Result:", table);
//
// 1列目の情報を変更.
//
table.Rows[0].SetField("COL-1", 100);
PrintTable("Result:", table);
}
DataTable BuildSampleTable(){
DataTable table = new DataTable();
table.BeginInit();
table.Columns.Add("COL-1", typeof(int));
table.Columns.Add("COL-2");
table.EndInit();
table.BeginLoadData();
for(int i = 0; i < 5; i++){
table.LoadDataRow(new object[]{i, (i + 1).ToString()}, true);
}
table.EndLoadData();
return table;
}
void PrintTable(string title, DataTable table){
Console.WriteLine(title);
foreach(DataRow row in table.Rows){
Console.WriteLine("\t{0}, {1}", row[0], row[1]);
}
Console.WriteLine();
}
}
#endregion