原文地址:http://www.cnblogs.com/kinger906/p/3428855.html
在实际开发过程中,或者是第三方公司提供的数据表结构,与我们系统中的实体类字段不对应,遇到这样我们怎么处理呢?可能有人会说,在转换时创建一个实体对象,对表里的数据逐行遍历来实例化这个实体对象不就完了。的确没错,这方法可行,但是这个方法效率极低,遇到亿万数据的话那就要实例化亿万个对象,更要命的是还要对每个对象的字段逐一赋值,由此可见它的效率了。
今天我无意在网上看到了一大牛写的一段代码,让我很感慨,现在我将它记录下来,希望对以后开发过程中有所用。
先看一下我的实体类
1
2
3
4
5
6
7
8
9
10
|
/// <summary>
/// 具体的实体类,和数据表中不同
/// </summary>
public
class
Person
{
[DataField(
"user_name"
)]
//表示数据库表里面的字段
public
string
UserName {
set
;
get
; }
//表示需要转换成的字段
[DataField(
"pass_word"
)]
public
string
PassWord {
set
;
get
; }
}
|
具体在代码中有注释,下面是转换类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
[AttributeUsage(AttributeTargets.Property)]
public
sealed
class
DataFieldAttribute : Attribute
{
/// <summary>
/// 表对应的字段名
/// </summary>
public
string
ColumnName {
set
;
get
; }
public
DataFieldAttribute(
string
columnName)
{
ColumnName = columnName;
}
}
public
static
class
DataConvert<T>
where
T :
new
()
{
/// <summary>
/// 将DataRow行转换成Entity
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
public
static
T ToEntity(DataRow dr)
{
T entity =
new
T();
Type info =
typeof
(T);
var
members = info.GetMembers();
foreach
(
var
mi
in
members)
{
if
(mi.MemberType == MemberTypes.Property)
{
//读取属性上的DataField特性
object
[] attributes = mi.GetCustomAttributes(
typeof
(DataFieldAttribute),
true
);
foreach
(
var
attr
in
attributes)
{
var
dataFieldAttr = attr
as
DataFieldAttribute;
if
(dataFieldAttr !=
null
)
{
var
propInfo = info.GetProperty(mi.Name);
if
(dr.Table.Columns.Contains(dataFieldAttr.ColumnName))
{
//根据ColumnName,将dr中的相对字段赋值给Entity属性
propInfo.SetValue(entity,
Convert.ChangeType(dr[dataFieldAttr.ColumnName], propInfo.PropertyType),
null
);
}
}
}
}
}
return
entity;
}
/// <summary>
/// 将DataTable转换成Entity列表
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public
static
List<T> ToList(DataTable dt)
{
List<T> list =
new
List<T>(dt.Rows.Count);
foreach
(DataRow dr
in
dt.Rows)
{
list.Add(ToEntity(dr));
}
return
list;
}
}
|
调用代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
DataTable dt =
new
DataTable();
dt.Columns.Add(
"user_name"
);
dt.Columns.Add(
"pass_word"
);
//这是表中的字段,现在需要将它们转换为具体的实体类实例
dt.Rows.Add(
"kingtiger"
,
"1"
);
dt.Rows.Add(
"wangbiao"
,
"2"
);
var
users = DataConvert<Person>.ToList(dt);
foreach
(
var
user
in
users)
{
Response.Write(user.UserName +
","
+ user.PassWord);
}
for
(
int
i = 0; i < dt.Rows.Count; i++)
{
Person p = DataConvert<Person>.ToEntity(dt.Rows[i]);
Response.Write(p.UserName +
","
+ p.PassWord);
}
|