一:反射的定义
审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。
System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码
System.Reflection.Assembly
System.Reflection.MemberInfo
System.Reflection.EventInfo
System.Reflection.FieldInfo
System.Reflection.MethodBase
System.Reflection.ConstructorInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type
层次模型:
二:获取类型信息:
1 class MyClass 2 { 3 public string m; 4 public void test() { } 5 public int MyProperty { get; set; } 6 } 7 8 //获取类型信息 9 protected void Button1_Click(object sender, EventArgs e) 10 { 11 Type type = typeof(MyClass); 12 Response.Write("类型名:" + type.Name); 13 Response.Write("<br/>"); 14 Response.Write("类全名:" + type.FullName); 15 Response.Write("<br/>"); 16 Response.Write("命名空间名:" + type.Namespace); 17 Response.Write("<br/>"); 18 Response.Write("程序集名:" + type.Assembly); 19 Response.Write("<br/>"); 20 Response.Write("模块名:" + type.Module); 21 Response.Write("<br/>"); 22 Response.Write("基类名:" + type.BaseType); 23 Response.Write("<br/>"); 24 Response.Write("是否类:" + type.IsClass); 25 Response.Write("<br/>"); 26 Response.Write("类的公共成员:"); 27 Response.Write("<br/>"); 28 MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员 29 foreach (var item in memberInfos) 30 { 31 Response.Write(string.Format("{0}:{1}", item.MemberType, item)); 32 Response.Write("<br/>"); 33 } 34 }
三:获取程序集信息
protected
void
Button2_Click(
object
sender, EventArgs e)
{
//获取当前执行代码的程序集
Assembly assem = Assembly.GetExecutingAssembly();
Response.Write(
"程序集全名:"
+assem.FullName);
Response.Write(
"<br/>"
);
Response.Write(
"程序集的版本:"
+assem.GetName().Version);
Response.Write(
"<br/>"
);
Response.Write(
"程序集初始位置:"
+assem.CodeBase);
Response.Write(
"<br/>"
);
Response.Write(
"程序集位置:"
+assem.Location);
Response.Write(
"<br/>"
);
Response.Write(
"程序集入口:"
+assem.EntryPoint);
Response.Write(
"<br/>"
);
Type[] types = assem.GetTypes();
Response.Write(
"程序集下包含的类型:"
);
foreach
(
var
item
in
types)
{
Response.Write(
"<br/>"
);
Response.Write(
"类:"
+item.Name);
}
}<br>
|
四:反射调用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
protected
void
Page_Load(
object
sender, EventArgs e)
{
System.Reflection.Assembly ass = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory+
"bin\\WebApplication1.dll"
);
//加载DLL
System.Type t = ass.GetType(
"WebApplication1.MainPage"
);
//获得类型
string
name=
typeof
(MainPage).AssemblyQualifiedName;
System.Type t1 = Type.GetType(name);
System.Type t2 =
typeof
(MainPage);
object
o = System.Activator.CreateInstance(t);
//创建实例
System.Reflection.MethodInfo mi = t.GetMethod(
"RunJs1"
);
//获得方法
mi.Invoke(o,
new
object
[] {
this
.Page,
"alert('测试反射机制')"
});
//调用方法
System.Reflection.MethodInfo mi1 = t.GetMethod(
"RunJs"
);
mi1.Invoke(t,
new
object
[] {
this
.Page,
"alert('测试反射机制1')"
});
//调用方法
}<br>
|
五:反射调用用户/自定义控件
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
|
protected
override
void
OnInit(EventArgs e)
{
//生成控件
CreateControl();
base
.OnInit(e);
}
private
void
CreateControl()
{
Table tb =
new
Table();
TableRow dr =
new
TableRow();
TableCell cell =
new
TableCell();
Control c = <span style=
"color: #ff0000;"
>LoadControl(
"WebUserControl1.ascx"
);
</span> cell.Controls.Add(c);
dr.Cells.Add(cell);
tb.Rows.Add(dr);
this
.PlaceHolder1.Controls.Add(tb);
}
protected
void
Button1_Click(
object
sender, EventArgs e)
{
foreach
(TableRow tr
in
PlaceHolder1.Controls[0].Controls)
{
foreach
(TableCell tc
in
tr.Controls)
{
foreach
(Control ctl
in
tc.Controls)
{
if
(ctl
is
UserControl)
{
Type type = ctl.GetType();
System.Reflection.MethodInfo methodInfo = type.GetMethod(
"GetResult"
);
string
selectedValue =
string
.Concat(methodInfo.Invoke(ctl,
new
object
[] { }));
Response.Write(selectedValue);
break
;
}
}
}
}
}<br>
|
六:反射实现工厂模式
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
|
public
partial
class
反射 : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
string
typeName =
typeof
(TestClass).AssemblyQualifiedName;
ITestInterface iface = RawGenericFactory.Create<ITestInterface>(typeName);
string
result = iface.doSomething();
Response.Write(result);
}
}
public
static
class
RawGenericFactory
{
public
static
T Create<T>(
string
typeName)
{
//Activator.CreateInstance 反射 根据程序集创建借口或者类
//Type.GetType() 根据名称获得程序集信息
//typeof(ConcertProduct).AssemblyQualifiedName
//_iproduct.GetType().AssemblyQualifiedName
return
(T)Activator.CreateInstance(Type.GetType(typeName));
}
}
public
interface
ITestInterface
{
string
doSomething();
}
public
class
TestClass : ITestInterface
{
public
int
Id {
get
;
set
; }
public
override
string
ToString()
{
return
Id.ToString();
}
public
string
doSomething()
{
return
"ok"
;
}
}<br>
|
七:自定义ORM框架
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
[Orm.Table(
"TestORM"
)]
public
class
TestORM
{
[Orm.Colum(
"Id"
,DbType.Int32)]
public
int
Id {
get
;
set
; }
[Orm.Colum(
"UserName"
, DbType.String)]
public
string
UserName {
get
;
set
; }
[Orm.Colum(
"Password"
, DbType.String)]
public
string
Password {
get
;
set
; }
[Orm.Colum(
"CreatedTime"
, DbType.DateTime)]
public
DateTime CreatedTime {
get
;
set
; }
}
protected
void
Button3_Click(
object
sender, EventArgs e)
{
TestORM t =
new
TestORM()
{
Id=1,
UserName=
"binfire"
,
Password=
"xxx"
,
CreatedTime=DateTime.Now
};
Orm.OrmHelp h=
new
Orm.OrmHelp();
h.Insert(t);
}
namespace
Orm
{
[AttributeUsageAttribute(AttributeTargets.Class, Inherited =
false
, AllowMultiple =
false
)]
public
class
TableAttribute : Attribute
{
//保存表名的字段
private
string
_tableName;
public
TableAttribute()
{
}
public
TableAttribute(
string
tableName)
{
this
._tableName = tableName;
}
///
/// 映射的表名(表的全名:模式名.表名)
///
public
string
TableName
{
set
{
this
._tableName = value;
}
get
{
return
this
._tableName;
}
}
}
[AttributeUsageAttribute(AttributeTargets.Property, Inherited =
false
, AllowMultiple =
false
)]
public
class
ColumAttribute : Attribute
{
private
string
_columName;
private
DbType _dbType;
public
ColumAttribute()
{
}
public
ColumAttribute(
string
columName)
:
this
()
{
this
._columName = columName;
}
public
ColumAttribute(
string
columName, DbType dbType)
:
this
(columName)
{
this
._dbType = dbType;
}
//列名
public
virtual
string
ColumName
{
set
{
this
._columName = value;
}
get
{
return
this
._columName;
}
}
//描述一些特殊的数据库类型
public
DbType DbType
{
get
{
return
_dbType; }
set
{ _dbType = value; }
}
}
public
class
OrmHelp
{
public
void
Insert(
object
table)
{
Type type = table.GetType();
//定义一个字典来存放表中字段和值的对应序列
Dictionary<
string
,
string
> columValue =
new
Dictionary<
string
,
string
>();
StringBuilder SqlStr =
new
StringBuilder();
SqlStr.Append(
"insert into "
);
//得到表名子
TableAttribute temp = (TableAttribute)type.GetCustomAttributes(
typeof
(TableAttribute),
false
).First();
SqlStr.Append(temp.TableName);
SqlStr.Append(
"("
);
PropertyInfo[] Propertys = type.GetProperties();
foreach
(
var
item
in
Propertys)
{
object
[] attributes = item.GetCustomAttributes(
false
);
foreach
(
var
item1
in
attributes)
{
//获得相应属性的值
string
value = table.GetType().InvokeMember(item.Name, System.Reflection.BindingFlags.GetProperty,
null
, table,
null
).ToString();
ColumAttribute colum = item1
as
ColumAttribute;
if
(colum !=
null
)
{
columValue.Add(colum.ColumName, value);
}
}
}
//拼插入操作字符串
foreach
(
var
item
in
columValue)
{
SqlStr.Append(item.Key);
SqlStr.Append(
","
);
}
SqlStr.Remove(SqlStr.Length - 1, 1);
SqlStr.Append(
") values('"
);
foreach
(
var
item
in
columValue)
{
SqlStr.Append(item.Value);
SqlStr.Append(
"','"
);
}
SqlStr.Remove(SqlStr.Length - 2, 2);
SqlStr.Append(
")"
);
HttpContext.Current.Response.Write(SqlStr.ToString());
}
}
}
|