泛型学习日记-2017.2.8

  第一次正式写随笔吧,有些东西用着还不太习惯,刚进入博客园的时候,就被一片题目大概为《压缩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         

 

转载于:https://www.cnblogs.com/Doumiao/p/6376577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值