Welcome 微信登录

首页 / 网页编程 / ASP.NET / 快速构建一个简单的个人框架系列(3)--FastObject具体实现编码

快速构建一个简单的个人框架系列(3)--FastObject具体实现编码2011-09-15 博客园 谦虚的天下前面说了那么多的不具体的想法和设计,今天我们就一个一个来实现它!

让我们一起来面对一个一个问题吧!

1.底层分别使用的是什么操作access数据库和sqlserver数据库的?

这个问题本是一个很麻烦的问题,我采用的是SqlHelper和AccessHelper,我也已经忘记了当初是从那 里下,在这里感谢原作者和汉化者。

2.你是如何把SqlDataReader和OleDbDataReader转换为T对象并自动赋值?

对于一个未知的实体类,想要向它的属性赋值,我用的是反射。

DbDataReader(使用父类能向下兼容)转换为Object的关键代码:

for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty (reader.GetName(i));//获取属性
if (reader.GetValue(i) != DBNull.Value)
{
p.SetValue(obj, reader.GetValue(i), null);//属性赋值
}
}

考虑到具体情况,具体代码:

//处理转化reader到object的类,方便随后转化为T
class ReaderHelper
{
public static object ReaderToObject(DbDataReader reader, object obj)
{
//针对CommonObject特别处理
Type t = obj.GetType();
if (t.Equals((new CommonObject()).GetType()))
{
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty("Co"+ (i+1).ToString());
if (reader.GetValue(i) != DBNull.Value)
{
p.SetValue(obj, reader.GetValue(i), null);
}
}
}
else
{
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty (reader.GetName(i));
if (reader.GetValue(i) != DBNull.Value)
{
p.SetValue(obj, reader.GetValue(i), null);
}
}
}
return obj;
}
}

注意:不可回避的是,这里面是有限制的,也可以算是一个bug吧!需要改进!