例如,我有一个类的对象:
class MyClass
{
public int a { get; set; }
public string b { get; set; }
public DateTime c { get; set; }
}
我有一个DataTable对象,其列名与MyClass中的名称相同。 是否有一种快速/简单的方法将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"];
}
谢谢你。
答案 0 :(得分: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;
}
答案 1 :(得分: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
}