我是要用excel转换为datatable,用datatable的header与实体类比较,
private static IList<T> GetSql<T>(List<DataColumn> l) where T : new()
{
Type t = typeof(T);
PropertyInfo[] p = t.GetProperties();
StringBuilder sb = new StringBuilder();
foreach (DataColumn dc in l)
{
foreach (PropertyInfo item in p)
{
if(dc.)
}
}
}这样写也不知道对不对,,写不出啊来了。
没看明白问题,T是什么?
GetSql<HZ.DrugTrade.Model.ProcureCatalog>(list);传过去的,也不知道对不对。
@灬丶: 你的意思是你现在有个datatable,然后你想把第一行的数据转为一个实体返回出去?
@Daniel Cai: 是这样的,导入excel数据是通过insert的语句实现的,但是这样写死了,如果excel要增加几列,就不行了。所以想动态的生成sql语句
@灬丶: excel增加的几列是从哪里拿到的?是T的属性列表还是你的datacolumn的那个方法参数?
@Daniel Cai: 不是啊,就是导入时如果别人要多导入几列数据,那么datacolumn肯定也要变啊,但是T是实体类,里面的属性都是固定的。
@灬丶: 你的意思是根据datacolumn那个参数确定新增的字段,然后通过某种方式读取到这些column对应的值,最后赋给T的实例?
如果是这样,这个column的值从哪里读?
@Daniel Cai: 从excel啊,通过方法读取到excel把他转换为datatable,反正是这样写的,不知道对不对,呵呵
List<DataColumn> list = new List<DataColumn>();
。。
for (int i = headerRow.FirstCellNum; i < cellCount; i++)
{
DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
dt.Columns.Add(column);
list.Add(column);
}
@灬丶: 你直接用odbc去连excel文件,然后select后不就是个dataset或者datareader了么?为什么还要这样绕弯弯?
@Daniel Cai: 呵呵,没用过odbc,。。。。
@灬丶: 只是驱动不一样(连接串),其他基本都一样的,何必一个cell一个cell的读呢
@Daniel Cai: 感觉反射这种东西对我这种渣渣好难理解
@灬丶: 你最好画一个树状图,从type画下来,然后下面memberinfo的几个派生类,这样学反射会简单些的。
转换为datatable你返回IList<T>干啥?
GetSql<HZ.DrugTrade.Model.ProcureCatalog>(list)
只是想把datatable的header放进去,不知道是不是这样写的
这个应该是你想要的 就是用DataROW去填充实体。找到匹配的属性就赋值 没有则赋默认值
1 /// <summary> 2 /// 装填实体 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="dr"></param> 6 /// <returns></returns> 7 public static T FilledModel<T>(DataRow dr) where T : new() { 8 var model = default(T); 9 try 10 { 11 model = new T(); 12 var arrPropertyInfo = model.GetType().GetProperties(); 13 var columnName = string.Empty; 14 15 Array.ForEach(arrPropertyInfo, propertyInfo => 16 { 17 Type type = propertyInfo.GetType(); 18 columnName = propertyInfo.Name; 19 var val = propertyInfo.GetValue(propertyInfo, null);//获取类型默认值 20 if (dr.Table.Columns.Contains(columnName) && dr[columnName] != DBNull.Value)//确认dr包含字段及值 21 { 22 try 23 { 24 propertyInfo.SetValue(model, Convert.ChangeType(dr[columnName], type), null); 25 } 26 catch 27 { 28 propertyInfo.SetValue(model, val, null); 29 } 30 } 31 else { 32 propertyInfo.SetValue(model, val, null); 33 } 34 }); 35 } 36 catch { } 37 38 return model; 39 } 40 }
感激,我来仔细看看
@灬丶: 列表就用这个
1 public static List<T> FilledModels<T>(IEnumerable<DataRow> drs) where T : new() 2 { 3 var list = drs.Select(FilledModel<T>).ToList(); 4 return list; 5 }
但是反射肯定效率不会太高。Emit方式效率会更高
@alci: 恩恩,我试试
@灬丶: 感觉反射这种东西对我这种渣渣好难理解
嘿嘿,DataTable.ToList<T>()就解决了呀,没有这么复杂
就想象excel就是个Table,然后ToList就ok了