在开发中,把查询结果以DataTable返回很方便,但是在检索数据时又很麻烦,没有模型类型检索方便。
所以很多人都是按照以下方式做的:
// 获得查询结果
DataTable dt = DbHelper.ExecuteDataTable(...);
// 把DataTable转换为IList<UserInfo>
IList<UserInfo> users = ConvertToUserInfo(dt);
问题:如果此系统有几十上百个模型,那不是每个模型中都要写个把DataTable转换为此模型的方法吗?
解决:能不能写个通用类,可以把DataTable转换为任何模型,呵呵,这就需要利用反射和泛型了
不多说,核心代码如下,经过测试,性能不错,大家可以根据实际情况改善
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Data;
using
System.Reflection;
namespace
NCL.Data
{
///
<summary>
///
实体转换辅助类
///
</summary>
public
class
ModelConvertHelper
<
T
>
where
T :
new
()
{
public
static
IList
<
T
>
ConvertToModel(DataTable dt)
{
//
定义集合
IList
<
T
>
ts
=
new
List
<
T
>
();
//
获得此模型的类型
Type type
=
typeof
(T);
string
tempName
=
""
;
foreach
(DataRow dr
in
dt.Rows)
{
T t
=
new
T();
//
获得此模型的公共属性
PropertyInfo[] propertys
=
t.GetType().GetProperties();
foreach
(PropertyInfo pi
in
propertys)
{
tempName
=
pi.Name;
//
检查DataTable是否包含此列
if
(dt.Columns.Contains(tempName))
{
//
判断此属性是否有Setter
if
(
!
pi.CanWrite)
continue
;
object
value
=
dr[tempName];
if
(value
!=
DBNull.Value)
pi.SetValue(t, value,
null
);
}
}
ts.Add(t);
}
return
ts;
}
}
}
使用方式:
// 获得查询结果
DataTable dt = DbHelper.ExecuteDataTable(...);
// 把DataTable转换为IList<UserInfo>
IList<UserInfo> users = ModelConvertHelper<UserInfo>.ConvertToModel(dt);
呵呵,这样子是不是很方便了,谢谢,希望能给你带来收获!