纯粹写着玩,在不使用ORM工具的情况下通过反正转换类型。
通常我们从数据库查询到一个 DataReader 或者是 一个 Table , 想要转换成 一个 list 或者是
一个model 的话 , 一般情况下是使用foreach 循环reader或是table的rows,然后在循环内创建个对象,通过reader[“列名”]来赋值对象的属性。如果表的字段少的话,用这种方式还可以,速度也快一点。但是如果后续还会增加字段的话,那就非常麻烦了,要改很多地方。工作量太大,而且还很容易出错。所以这个时候使用反射来转换的话就非常便捷了。我们只管增加字段,改一下数据表对应的model,调用这个工具类的方法,传入相对应的参数就能得到想要的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| public static List<T> ConvertToList<T>(DataTable dt) { List<T> list = new List<T>(); Type type = typeof(T); string tempName = ""; PropertyInfo[] propertys = type.GetProperties(); foreach (DataRow dr in dt.Rows) { object obj = type.Assembly.CreateInstance(type.FullName); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; if (dt.Columns.Contains(tempName)) { if (!pi.CanWrite) continue; object value = dr[tempName]; if (value != DBNull.Value) pi.SetValue(obj, value, null); } } list.Add((T)obj); } return list; }
public static List<T> ConvertToList<T>(IDataReader reader) { List<T> list = new List<T>(); Type type = typeof(T); string tempName = ""; PropertyInfo[] propertys = type.GetProperties(); while (reader.Read()) { object obj = type.Assembly.CreateInstance(type.FullName); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; if (ReaderExists(reader, tempName)) { if (!pi.CanWrite) continue; object value = reader[tempName]; if (value != DBNull.Value) pi.SetValue(obj, value, null); } } list.Add((T)obj); } return list; }
public static T ConvertToModel<T>(IDataReader reader) { Type type = typeof(T); PropertyInfo[] proList = type.GetProperties(); object obj = type.Assembly.CreateInstance(type.FullName); string tempName = ""; if (reader.Read()) { foreach (PropertyInfo pi in proList) { tempName = pi.Name; if (ReaderExists(reader, pi.Name)) { if (!pi.CanWrite) continue; object value = reader[tempName]; if (value != DBNull.Value) pi.SetValue(obj, value, null); } } } return (T)obj; }
public static T ConvertToModel<T>(DataRow row) { Type type = typeof(T); PropertyInfo[] proList = type.GetProperties(); object obj = type.Assembly.CreateInstance(type.FullName); string tempName = ""; foreach (PropertyInfo pi in proList) { tempName = pi.Name; if (!string.IsNullOrEmpty(row[tempName].ToString())) { if (!pi.CanWrite) continue; object value = row[tempName]; if (value != DBNull.Value) pi.SetValue(obj, value, null); } } return (T)obj; }
private static bool ReaderExists(IDataReader reader, string columnName) { int count = reader.FieldCount; for (int i = 0; i < count; i++) { if (reader.GetName(i).Equals(columnName)) { return true; } } return false; }
|