1

DataTable を使用して、オブジェクトのグループを作成および設定しようとしています。type関数に渡されたオブジェクトに基づいて、どのタイプのオブジェクトを作成するかを知る 1 つの関数を作成したいと考えていました。次に、 または Reflection によって返されたオブジェクトを使用してActivator.CreateInstance(type)、オブジェクト フィールドにデータセットのデータを入力します。これが私の機能です:

private object DataTableToObject(DataTable table, Type type)
{
    var obj = Activator.CreateInstance(type);
    //we are only concerned with the first row here

    var row = table.Rows[0];

    /* do something here to populate the fields of MyObject */
}

この関数をこのように呼び出すことを望んでいました...

var dataTable1 = DataTableToObject(dataSet.Tables[dataSet.Tables.IndexOf("MyCustomObject")]);
MyCustomObject custObj = DataTableToObject(dataTable1, typeof(MyCustomObject));

編集:実行時にオブジェクトのフィールドにデータを入力する最良の方法は何ですか? リフレクションを使用してフィールド名を取得し、フィールド名を使用して何らかの方法でオブジェクトを設定する必要がありますか?

解決!

private T DataTableToObject<T>(DataTable table)
{
    var obj = Activator.CreateInstance(typeof(T));

    //we are only concerned with the first row because in our datasets, we should only have one row per table
    var row = table.Rows[0];

    foreach(DataColumn col in table.Columns)
    {
        var propInfo = obj.GetType().GetProperty(col.ColumnName);
        if (propInfo == null) continue;

        object colValue;
        if(propInfo.PropertyType == typeof(Guid))
           colValue = Guid.Parse(row[col.ColumnName].ToString());
        else 
           colValue = Convert.ChangeType(row[col.ColumnName], propInfo.PropertyType);

        propInfo.SetValue(obj, colValue, null);
     }
     return (T) obj;
}
4

1 に答える 1