我正在尝试使用DataTable来创建和填充一组对象。我希望创建一个函数,根据传递给函数的type
知道要创建什么类型的对象。然后使用Activator.CreateInstance(type)
或Reflection返回的对象,使用数据集中的数据填充对象字段。这是我的功能:
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;
}
答案 0 :(得分:1)
首先使方法通用:
private T DataTableToObject<T>(DataTable table)
然后稍微改变一下:
var obj = Activator.CreateInstance(typeof(T));
并在方法结束时记得施放它:
return (T)obj;
现在,当你调用它时,它将如下所示:
MyCustomObject custObj = DataTableToObject<MyCustomObject>(dataTable1);
现在如何填充字段,我会做这样的事情:
foreach (var col in table.Columns)
{
var propInfo = obj.GetType().GetProperty(col.Name);
if (propInfo == null) { continue; }
propInfo.SetValue(obj, row[col.Name], null);
}