[原创]让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型

以前在开发一个系统的时候

小组里的人在写方法的时候很累,很多方法都是对象的属性需要大量的重复赋值,然后 添加到List对象中

你是否还在为一个对象里有几十 上百个属性 手动写代码赋值烦恼呢?

下面是一个以前的读取数据库 信息的例子

[c-sharp] view plain copy print ?
  1. public IList<KFS_Model.QAS_V_MessageInfo> PagerTest(string where, KFS_Model.Pager p) 
  2.         { 
  3.             SqlDataReader dr = null
  4.             string table = "QAS_V_MessageInfo"
  5.             string orderby = "QuestionTime"
  6.             IList<KFS_Model.QAS_V_MessageInfo> list = new List<KFS_Model.QAS_V_MessageInfo>(); 
  7.             Pagination.page(table, where, orderby, true,p); 
  8.             dr = Pagination.page(table, where, orderby, false, p); 
  9.             while (dr.Read()) 
  10.             { 
  11.                 KFS_Model.QAS_V_MessageInfo qas = new KFS_Model.QAS_V_MessageInfo(); 
  12.                 qas.UserId = dr.GetGuid(1); 
  13.                 qas.UserName = dr.GetString(2); 
  14.                 qas.SonModelId = dr.GetGuid(3); 
  15.                 qas.SonModelName = dr.GetString(4); 
  16.                 qas.QuestionId = dr.GetGuid(5); 
  17.                 qas.QuestionTitle = dr.GetString(6); 
  18.                 qas.QuestionUrl = dr.GetString(7); 
  19.                 qas.QuestionTime = dr.GetDateTime(8); 
  20.                 qas.QuestionSession = dr.GetInt32(9);  
  21. qas.QuestionContent = dr.GetString(10);
  22.                 qas.FatherModelId = dr.GetGuid(11); 
  23.                 list.Add(qas); 
  24.             } 
  25.             return list;             
  26.         } 

赋值语句占了方法的一半

而且写起来还要一个一个的对照

很郁闷的说

下面就是我今天公布的源码  无任何版权  欢迎转载

首先构造一个泛型类

public class ClassName<T>

{

}

然后定义一个方法 方法返回集合

[c-sharp] view plain copy print ?
  1. public class Class1<T> 
  2.     public IList<T> GetData(SqlDataReader reader) 
  3.     { 
  4.         IList<T> list = new List<T>(); 
  5.         Type type = typeof(T); 
  6.         PropertyInfo[] properties = type.GetProperties(); 
  7.  
  8.         while (reader.Read()) 
  9.         { 
  10.             T t = Activator.CreateInstance<T>(); 
  11.             for (int i = 0; i < properties.Length; i++) 
  12.             { 
  13.                 properties[i].SetValue(t, reader[i + 1], null); 
  14.  
  15.             } 
  16.  
  17.             list.Add(t); 
  18.         } 
  19.  
  20.         return list; 
  21.     } 

上面给出了核心代码 如果你要传递sql语句

那你的业务逻辑层 就要这一个方法也就够了!

下面一个扩展方法 由 论坛的sql1234提供 在一次感叹 linq语法的简洁

[c-sharp] view plain copy print ?
  1. public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T : new() 
  2.     var fs = (from fd in typeof(T).GetFields() 
  3.                 let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) } 
  4.                 where desc.index >= 0 
  5.                 select desc) 
  6.             .ToList(); 
  7.     foreach (var x in rd) 
  8.     { 
  9.         var obj = new T(); 
  10.         fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); }); 
  11.         yield return obj; 
  12.     } 

这里,我们通过扩展方法,为任意DbDataReader都增加了一个GetObjects方法,返回任意指定类型的强类型的对象集合。
如果包括private的field才更完整。应该将 GetFields() 修改为
GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值