3

たとえば、次のクラスのオブジェクトがあります。

class MyClass
{
public int a { get; set; }
public string b { get; set; }
public DateTime c { get; set; }
}

そして、MyClassと同じ名前の列を持つDataTableオブジェクトがあります。DataTableオブジェクトの各行をMyClassオブジェクトにコピーするための高速で簡単な方法はありますか?

このように(しかし私の場合は列が多すぎます):

for (int x = 0; x < dataTableObj.Rows.Count; x++)
{
myClassObj[x].a = dataTableObj.Rows[x]["a"];
myClassObj[x].b = dataTableObj.Rows[x]["b"];
myClassObj[x].c = dataTableObj.Rows[x]["c"];
}

ありがとう。

4

2 に答える 2

5

以下でこのメソッドを使用しているまさにその目的のために、データテーブルの列と型のプロパティは同じ名前である必要があります。

public static List<T> TableToList<T>(DataTable table)
{
  List<T> rez = new List<T>();
  foreach (DataRow rw in table.Rows)
  {
    T item = Activator.CreateInstance<T>();
    foreach (DataColumn cl in table.Columns)
    {
      PropertyInfo pi = typeof(T).GetProperty(cl.ColumnName);

      if (pi != null && rw[cl] != DBNull.Value)
      {
        var propType = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType;
        pi.SetValue(item, Convert.ChangeType(rw[cl], propType), new object[0]);
      }

    }
    rez.Add(item);
  }
  return rez;
}
于 2012-11-27T16:43:19.650 に答える
3

ニーズに合わせて以下のコードを変更できるはずです。

var myBindings = System.Reflection.BindingFlags.Instance
        | System.Reflection.BindingFlags.Public 
        | System.Reflection.BindingFlags.SetProperty;

foreach (var row in table.AsEnumerable())
{
    MyClass newObject = new MyClass();
    foreach (var property in typeof(MyClass).GetProperties(myBindings))
    {
        if (table.Columns.Contains(property.Name))
        {
            //optionally verify that the type of the property matches what's in the datatable
            property.SetValue(newObject, row[property.Name]);
        }
    }
    //add newObject to result collection
}
于 2012-11-27T16:13:20.130 に答える