[原创]让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型
2013-08-17 09:43
507 查看
以前在开发一个系统的时候
小组里的人在写方法的时候很累,很多方法都是对象的属性需要大量的重复赋值,然后 添加到List对象中
你是否还在为一个对象里有几十 上百个属性 手动写代码赋值烦恼呢?
下面是一个以前的读取数据库 信息的例子
[c-sharp]
view plaincopyprint?
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;
}
上面给出了核心代码 如果你要传递sql语句
那你的业务逻辑层 就要这一个方法也就够了!
下面一个扩展方法 由 论坛的sql1234提供 在一次感叹 linq语法的简洁
[c-sharp]
view plaincopyprint?
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;
}
}
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)
小组里的人在写方法的时候很累,很多方法都是对象的属性需要大量的重复赋值,然后 添加到List对象中
你是否还在为一个对象里有几十 上百个属性 手动写代码赋值烦恼呢?
下面是一个以前的读取数据库 信息的例子
[c-sharp]
view plaincopyprint?
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;
}
[c-sharp] view plaincopyprint? 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; } } 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]
view plaincopyprint?
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;
}
}
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脚本中使用大量重复代码的解决方法
- 使用Python获取并处理IP的类型及格式方法
- 利用Java反射根据属性名获取对象值和类型代码
- 反射_通过反射获取成员变量、构造方法、成员方法的使用
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
- 代码实现获取log日志和logcat使用方法
- java再复习——通过反射获取到方法的参数和返回值的泛型类型
- java反射遍历实体类属性和类型,并赋值和获取值的简单方法
- 使用PropertyInfo类反射获取类 的类型
- 反射机制获取方法的参数类型和返回值类型
- Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
- java基础-反射2(反射,反射操作对象,Class对象的使用,类型信息的获取)
- 使用反射获取字节码文件中的方法