博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型 .
阅读量:4691 次
发布时间:2019-06-09

本文共 3842 字,大约阅读时间需要 12 分钟。

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

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

 

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

 

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

[c-sharp]
  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 IList<KFS_Model.QAS_V_MessageInfo> PagerTest(string where, KFS_Model.Pager p) { SqlDataReader dr = null; string table = "QAS_V_MessageInfo"; string orderby = "QuestionTime"; IList<KFS_Model.QAS_V_MessageInfo> list = new List<KFS_Model.QAS_V_MessageInfo>(); Pagination.page(table, where, orderby, true,p); dr = Pagination.page(table, where, orderby, false, p); while (dr.Read()) { KFS_Model.QAS_V_MessageInfo qas = new KFS_Model.QAS_V_MessageInfo(); qas.UserId = dr.GetGuid(1); qas.UserName = dr.GetString(2); qas.SonModelId = dr.GetGuid(3); qas.SonModelName = dr.GetString(4); qas.QuestionId = dr.GetGuid(5); qas.QuestionTitle = dr.GetString(6); qas.QuestionUrl = dr.GetString(7); qas.QuestionTime = dr.GetDateTime(8); qas.QuestionSession = dr.GetInt32(9); qas.QuestionContent = dr.GetString(10); qas.FatherModelId = dr.GetGuid(11); list.Add(qas); } return list; }

 

 

赋值语句占了方法的一半

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

 

很郁闷的说

 

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

 

首先构造一个泛型类

 

 

public class ClassName<T>

{

 

}

 

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

 

 

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

public class Class1<T> { public IList<T> GetData(SqlDataReader reader) { IList<T> list = new List<T>(); Type type = typeof(T); PropertyInfo[] properties = type.GetProperties(); while (reader.Read()) { T t = Activator.CreateInstance<T>(); for (int i = 0; i < properties.Length; i++) { properties[i].SetValue(t, reader[i + 1], null); } list.Add(t); } return list; } } 

 

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

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

 

 

 

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

 

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

public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T : new() { var fs = (from fd in typeof(T).GetFields() let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) } where desc.index >= 0 select desc) .ToList(); foreach (var x in rd) { var obj = new T(); fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); }); yield return obj; } }

 

 

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

转载于:https://www.cnblogs.com/WikStone/archive/2012/05/03/2480441.html

你可能感兴趣的文章
windows安装mysql
查看>>
李宏毅 2018最新GAN课程 class 3 Theory behind GAN
查看>>
gnu
查看>>
大型网站架构读后感
查看>>
第四组-16通信2班-056 OSPF、OSPFv3协议
查看>>
新霸哥带你进入java的世界
查看>>
省选专练IOI2000邮局(S4共享单车)
查看>>
1.1 为什么要使用lambda 表达式
查看>>
第八周作业
查看>>
bzoj 3462: DZY Loves Math II
查看>>
Minimum Depth of Binary Tree
查看>>
【python】详解map函数的用法之函数并行作用解析
查看>>
单调队列与DP
查看>>
程序猿年终总结:我看了我的这7年
查看>>
handler的使用
查看>>
如何让wp7真机调试时候保持屏幕高亮不锁屏
查看>>
网络编程
查看>>
window下python安装pip
查看>>
【剑指offer】Q14:调整数组顺序使奇数位于偶数前面
查看>>
CSS3 Flexbox轻松实现元素的水平居中和垂直居中
查看>>