新思维,Attribute-Cener Designing (Framework的设计与应用 学习笔记)
本节中用Attribute技术实现一个简单的ORM,什么是ORM呢?就是将数据表对应成对象。
本节采用Record Mapping的方式。
1:创建record对象
1
using System;
2
using System.System.componentModel;
3
using PowerORM;
4
5
namesapce WindowsApplication5
6
{
7
public class Customer
8
{
9
private string _customerID,_companyName,_contactName;
10
public string CustomerID
11
{
12
get
13
{
14
return _customerID;
15
}
16
set
17
{
18
_customerID=value;
19
}
20
}
21
22
public string CompanyName
23
{
24
get
25
{
26
return _companyName;
27
}
28
set
29
{
30
_companyName=value;
31
}
32
}
33
34
public string ContactName
35
{
36
get
37
{
38
return _contactName;
39
}
40
set
41
{
42
_contactName=value;
43
}
44
}
45
46
public Customer()
47
}
48
}
49
}
50
using System;2
using System.System.componentModel;3
using PowerORM;4

5
namesapce WindowsApplication56
{7
public class Customer8
{9
private string _customerID,_companyName,_contactName;10
public string CustomerID11
{12
get13
{14
return _customerID;15
}16
set17
{18
_customerID=value;19
}20
}21
22
public string CompanyName23
{24
get25
{26
return _companyName;27
}28
set29
{30
_companyName=value;31
}32
}33
34
public string ContactName35
{36
get37
{38
return _contactName;39
}40
set41
{42
_contactName=value;43
}44
}45
46
public Customer()47
}48
}49
}50

现在假设已由数据库读出一条数据,如何将数据填入到这个对象中呢?两个方法(1),用Reflection技术枚举对象中的属性,再以属性名为一句取得同名字段,填入数据,有个缺点,属性名受到字段名限制。
(2) 使用Attribute为属性贴上一个标签,下面就是这个“标签” 的代码:
1
using System;
2
using System.Component;
3
namespace PowerORM
4
{
5
[AttributeUsage(AttributeTargets.Property,Inherited=false,allowMultiple=false)]
6
7
public class ColumnAttribute:Attribute
8
{
9
private string _columnName=null;
10
11
public string ColumnName
12
{
13
get
14
{
15
return _columnName;
16
}
17
}
18
19
public ColumnAttribute(string columnName)
20
{
21
_columnName=columnName;
22
}
23
}
24
}
using System;2
using System.Component;3
namespace PowerORM4
{5
[AttributeUsage(AttributeTargets.Property,Inherited=false,allowMultiple=false)]6
7
public class ColumnAttribute:Attribute8
{9
private string _columnName=null;10
11
public string ColumnName12
{13
get14
{15
return _columnName;16
}17
}18
19
public ColumnAttribute(string columnName)20
{21
_columnName=columnName;22
}23
}24
}有了ColumnAttribute之后,用户可以在属性上贴一个标签,代表该属性所对应的字段
如:
[Column("CompnayName")]
public string CompanyName
最后撰写Fill数据的Helper对象,此对象将会依据对象中的Attribue设置来填充数据。
1
using system;
2
using System.Collections;
3
using System.ComponentModel;
4
using System.Refection;
5
using System.Data;
6
using System.Data.Common;
7
8
namespace PowerORM
9
{
10
public sealed class FillHelper
11
{
12
//两个参数是代表一行数据的类、数据记录
13
public static IList Fill(Type rowType, IDataReader reader)
14
15
{
16
ArrarList dataList=new ArraryList();
17
18
while(reader.Read()) //对每行数据
19
{
20
object item=Activator.CreateInstance(rowType,false);
21
//使用activator.CreateInstance见了一个rowType类 ,第二个参数表示是否使用默认构造函数
22
23
foreach(MemberInfo mi in rowType.GetMembers())
24
//获取“数据行类”的所有成员
25
{
26
foreach(ColumnAttribute attr in Attribute.GetcustomAttributes(mi,typeOf(ColumnAttribute),false))
27
//获取“数据行类”中“某成员”的所有自定义标签,本例子将只获取到一个
28
{
29
int index=reader.GetOrdinal(attr.ColumnName); //在“数据记录”中查找此“自定义标签”所代表的数据的序号
30
31
if(index!=-1)
32
//如果存在
33
{
34
if(mi.MemberType==MemberTypes.Field) //如果此成员是"Field"类型
35
((FieldInfo)mi).SetValue(item,reader.GetValue(index)); //把 reader.GetValue(index)赋值给 “行数据对象 item"的 mi成员 ,mi为 Field类型
36
else if(mi.MemberType==MemberTypes.Property)
37
((PropertyInfo)mi).SetValue(item,reader,GetValue(index),null); //基本同上
38
}
39
}
40
}
41
42
dataList.Add(iem);
43
}
44
return dataList;
45
}
46
private FillHelper()
47
{
48
}
49
}
50
}
51
52
53
using system;2
using System.Collections;3
using System.ComponentModel;4
using System.Refection;5
using System.Data;6
using System.Data.Common;7

8
namespace PowerORM9
{10
public sealed class FillHelper11
{12
//两个参数是代表一行数据的类、数据记录13
public static IList Fill(Type rowType, IDataReader reader)14
15
{16
ArrarList dataList=new ArraryList();17
18
while(reader.Read()) //对每行数据19
{20
object item=Activator.CreateInstance(rowType,false);21
//使用activator.CreateInstance见了一个rowType类 ,第二个参数表示是否使用默认构造函数22
23
foreach(MemberInfo mi in rowType.GetMembers())24
//获取“数据行类”的所有成员25
{26
foreach(ColumnAttribute attr in Attribute.GetcustomAttributes(mi,typeOf(ColumnAttribute),false))27
//获取“数据行类”中“某成员”的所有自定义标签,本例子将只获取到一个28
{29
int index=reader.GetOrdinal(attr.ColumnName); //在“数据记录”中查找此“自定义标签”所代表的数据的序号30
31
if(index!=-1)32
//如果存在33
{34
if(mi.MemberType==MemberTypes.Field) //如果此成员是"Field"类型35
((FieldInfo)mi).SetValue(item,reader.GetValue(index)); //把 reader.GetValue(index)赋值给 “行数据对象 item"的 mi成员 ,mi为 Field类型36
else if(mi.MemberType==MemberTypes.Property)37
((PropertyInfo)mi).SetValue(item,reader,GetValue(index),null); //基本同上38
}39
}40
}41
42
dataList.Add(iem);43
}44
return dataList;45
}46
private FillHelper()47
{48
}49
}50
}51

52
53


浙公网安备 33010602011771号