public static T DataReaderToEntity<T>(IDataReader dr, T entity) { try { PropertyInfo[] pilist = entity.GetType().GetProperties(); foreach (PropertyInfo pi in pilist) { for (int i = 0; i < dr.FieldCount; i++) { if (pi.Name.Equals(dr.GetName(i))) { pi.SetValue(entity, Convert.ChangeType(dr[i], pi.PropertyType), null); } } } return entity; } catch { return default(T); } }
上面的方法利用反射读取SqlDataReader对应值。红色部分转换为相应的类型
有时候会有一些特殊情况,比如Guid和string之间的转换可能会报错,object must implement IConvertible
那么需要加入前置判断
if (!dr[i].GetType().IsPrimitive) {string me = dr[i].ToString(); pi.SetValue(entity, me, null); }
因为直接使用Convert.ChangeType会报错