第一次正式写随笔吧,有些东西用着还不太习惯,刚进入博客园的时候,就被一片题目大概为《压缩30000行代码到15行》的文章所吸引了,于是就自己试着造个轮子吧。
测试的是asp.net与数据库交互的部分,不过,只做了一个简单地函数改写:
原代码:
1 public static Config_shebei GetConfig_shebeiById(int id) 2 { 3 string sql = "SELECT * FROM Config_shebei WHERE Id = @Id"; 4 5 try 6 { 7 SqlDataReader reader = DBHelper.GetReader(sql, new SqlParameter("@Id", id)); 8 if (reader.Read()) 9 { 10 11 Config_shebei config_shebei = new Config_shebei(); 12 13 try{ 14 config_shebei.Id = (int)reader["Id"]; 15 }catch 16 {} 17 try{ 18 config_shebei.Leibie = (string)reader["Leibie"]; 19 }catch 20 {} 21 try{ 22 config_shebei.Mingcheng = (string)reader["Mingcheng"]; 23 }catch 24 {} 25 try{ 26 config_shebei.Bumen = (string)reader["Bumen"]; 27 }catch 28 {} 29 try{ 30 config_shebei.Zhuangtai = (string)reader["Zhuangtai"]; 31 }catch 32 {} 33 try{ 34 config_shebei.UserName = (string)reader["UserName"]; 35 }catch 36 {} 37 38 reader.Close(); 39 40 return config_shebei; 41 } 42 else 43 { 44 reader.Close(); 45 return null; 46 } 47 } 48 catch (Exception e) 49 { 50 Console.WriteLine(e.Message); 51 throw e; 52 } 53 }
改写后的代码:
1 public static T GetById<T>(int id) where T : new() 2 { 3 T obj = new T();//实例化一个T类型的obj对象 4 Type t = obj.GetType();//获取obj的类型 5 string sql = "SELECT * FROM " + typeof(T).Name.ToString() + " WHERE Id = @Id"; 6 7 try 8 { 9 SqlDataReader reader = DBHelper.GetReader(sql, new SqlParameter("@Id", id)); 10 if (reader.Read()) 11 { 12 foreach (var item in t.GetProperties())//遍历obj所有属性 13 { 14 try 15 { 16 //对obj相应的属性赋值 17 obj.GetType().GetProperty(item.Name).SetValue(obj,reader[item.Name.ToString()], null); 18 } 19 catch 20 { } 21 } 22 23 reader.Close(); 24 return obj; 25 } 26 else 27 { 28 reader.Close(); 29 return default(T); 30 } 31 } 32 catch (Exception e) 33 { 34 Console.WriteLine(e.Message); 35 throw e; 36 } 37 }
但是有什么收获呢?貌似没事么收获,对泛型的理解依然是模模糊糊,知其然而不知其所以然,这种状态最要命了~~~
11.01:修改了第二个函数
原代码:
1 public static Config_shebei AddConfig_shebei(Config_shebei config_shebei) 2 { 3 string sql = 4 "INSERT Config_shebei (Leibie, Mingcheng, Bumen, Zhuangtai, UserName)" + 5 "VALUES (@Leibie, @Mingcheng, @Bumen, @Zhuangtai, @UserName)"; 6 7 sql += " ; SELECT @@IDENTITY"; 8 9 try 10 { 11 SqlParameter[] para = new SqlParameter[] 12 { 13 new SqlParameter("@Leibie", DBHelper.GetValueByWhetherNull(config_shebei.Leibie)), 14 new SqlParameter("@Mingcheng", DBHelper.GetValueByWhetherNull(config_shebei.Mingcheng)), 15 new SqlParameter("@Bumen", DBHelper.GetValueByWhetherNull(config_shebei.Bumen)), 16 new SqlParameter("@Zhuangtai", DBHelper.GetValueByWhetherNull(config_shebei.Zhuangtai)), 17 new SqlParameter("@UserName", DBHelper.GetValueByWhetherNull(config_shebei.UserName)) 18 }; 19 20 int newId = DBHelper.GetScalar(sql, para); 21 22 return GetById<Config_shebei>(newId); 23 //return GetConfig_shebeiById(newId); 24 } 25 catch (Exception e) 26 { 27 Console.WriteLine(e.Message); 28 throw e; 29 } 30 } 31
修改后代码:
1 public static T AddItem<T>(T obj) where T : new() 2 { 3 Type t = obj.GetType(); 4 string Sql = "INSERT " + t.Name.ToString() + " ("; 5 //遍历一遍又一遍,从而生成相应的SQL语句,除掉主键Id 6 //所以对于多主键的数据库不太实用 7 foreach (var item in t.GetProperties()) 8 { 9 if (item.Name.ToString() == "Id") 10 continue; 11 Sql += item.Name.ToString(); 12 if (item != t.GetProperties()[t.GetProperties().Length - 1]) 13 { 14 Sql += ","; 15 } 16 else 17 { 18 Sql += ") VALUES ("; 19 } 20 } 21 foreach (var item in t.GetProperties()) 22 { 23 if (item.Name.ToString() == "Id") 24 continue; 25 Sql += "@"; 26 Sql += item.Name.ToString(); 27 if (item != t.GetProperties()[t.GetProperties().Length - 1]) 28 { 29 Sql += ","; 30 } 31 else 32 { 33 Sql += ") ; SELECT @@IDENTITY"; 34 } 35 } 36 37 //增加查询参数 38 try 39 { 40 int i = 0; 41 SqlParameter[] para = new SqlParameter[t.GetProperties().Length-1]; 42 foreach (var item in t.GetProperties()) 43 { 44 if (item.Name.ToString() == "Id") 45 continue; 46 para[i] = new SqlParameter("@" + item.Name.ToString(), DBHelper.GetValueByWhetherNull(t.GetProperty(item.Name.ToString()).GetValue(obj,null))); 47 //这里需要注释一下,SqlParameter("@" + 字段名,value),t.GetProperty(item.Name.ToString()).GetValue(obj,null), 48 //类型为t的obj对象的名字为item.Name的属性,注意ToString()的使用 49 i++; 50 } 51 52 int newId = DBHelper.GetScalar(Sql, para); 53 54 return GetItemById<T>(newId); 55 } 56 catch (Exception e) 57 { 58 Console.WriteLine(e.Message); 59 throw e; 60 } 61 } 62