让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型 .
2012-06-12 21:30
561 查看
以前在开发一个系统的时候
小组里的人在写方法的时候很累,很多方法都是对象的属性需要大量的重复赋值,然后 添加到List对象中
你是否还在为一个对象里有几十 上百个属性 手动写代码赋值烦恼呢?
下面是一个以前的读取数据库 信息的例子
赋值语句占了方法的一半
而且写起来还要一个一个的对照
很郁闷的说
下面就是我今天公布的源码 无任何版权 欢迎转载
首先构造一个泛型类
public class ClassName<T>
{
}
然后定义一个方法 方法返回集合
上面给出了核心代码 如果你要传递sql语句
那你的业务逻辑层 就要这一个方法也就够了!
下面一个扩展方法 由 论坛的sql1234提供 在一次感叹 linq语法的简洁
这里,我们通过扩展方法,为任意DbDataReader都增加了一个GetObjects方法,返回任意指定类型的强类型的对象集合。
如果包括private的field才更完整。应该将 GetFields() 修改为
GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)
小组里的人在写方法的时候很累,很多方法都是对象的属性需要大量的重复赋值,然后 添加到List对象中
你是否还在为一个对象里有几十 上百个属性 手动写代码赋值烦恼呢?
下面是一个以前的读取数据库 信息的例子
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>
{
}
然后定义一个方法 方法返回集合
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语法的简洁
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)
相关文章推荐
- 让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型
- [原创]让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型
- [原创]让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型
- 让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型
- 让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型 .
- tcl/tk脚本中使用大量重复代码的解决方法
- 使用反射技术获取指定类型中方法的完整信息
- 【获取iOS设备类型与系统版本号】结构体utsname与uname方法的使用
- 微信开发三 使用反射根据消息类型自动调用不同方法
- 反射_通过反射获取无参无返回值成员方法并使用
- 扩展方法的几个实例,扩展基本类型、接口、通过反射让扩展方法使用私有成员等
- C#--反射使用Start!-获取对象的字段/属性/方法/成员/构造方法
- spring mvc使用GET请求获取Date类型的方法
- java反射获取类的类名、属性名、属性类型、方法、执行方法、构造函数
- 利用反射获取方法的反回值类型和参数个数
- 反射获取方法参数与返回值类型
- java反射遍历实体类属性和类型,并赋值和获取值的简单方法
- 【代码】获取https里面内容的方法和技巧使用php
- 使用java调用C语言的方法,让java获取串口数据并生成一个String对象的代码。
- iOS 日期转String 代码类型的使用方法