Type是System.Reflection功能的根 (Root),也是存取Metadata的主要方法.
使用Type的成員可以取得相關(guān)資訊,例如建構(gòu)函式(Constructor),方法,字段,屬性和類別的事件,以及模組和部署類別的組件(Assembly).
3種取得Type的方法:
1.靜態(tài)方法
Type.GetType()
2.運(yùn)算符
typeof()
3.實(shí)例的方法GetType
Employee e=new Employee();
e.GetType()
在一般情況下我們調(diào)用的方法並傳遞給它們的參數(shù),某些情況下可能希望根據(jù)用戶操作動(dòng)態(tài)調(diào)用方法.
通過(guò)Reflection命名空間
方法1是使用Type對(duì)象上的InvokeMember方法
方法2是使用MethodInfo對(duì)象上的Invoke方法
example:
先定義類Employee
其中有靜態(tài)屬性Data
實(shí)例屬性Name,ID
2個(gè)索引器
???? /// ?自定義類
???? /// ? </summary>
???? public ? class ?Employee
????{
???????? string ?name;
???????? int ?id;
????????ArrayList?list;?
???????? static ? int ?data;
????????
???????? // instance?.ctor()
???????? public ?Employee(? int ?id,?String?name?)?
????????{
???????????? this .name? = ?name;
???????????? this .id? = ?id;
????????????list = new ?ArrayList();
???????????? this .list.Add(? " 001 " ?);
???????????? this .list.Add(? " 002 " ?);
????????}
???????? // static?.ctor()
???????? static ?Employee()
????????{
????????????data = 119 ;
????????}
???????? public ? override ? string ?ToString?()
????????{
???????????? return ? " Id= " + ?id.ToString()? + ? " ,?Name= " ? + ?name;
????????}
???????? // instance?Method?"add"
???????? public ? string ?add(? string ?key1, string ?key2?)
????????{
???????????? string ?result = key1 + key2;
???????????? return ?result;
????????}
????????
???????? // static?Method?"add"
???????? public ? static ? string ?add(? string ?key1, string ?key2, string ?key3?)
????????{
???????????? return ?key1 + key2 + key3;
????????}
???????? public ? string ?Name?
????????{
???????????? get ?
????????????{?
???????????????? return ??name;?
????????????}
???????????? set ?
????????????{?
????????????????name? = ?value;?
????????????}
????????}
???????? public ? int ?ID?
????????{
???????????? get ?
????????????{?
???????????????? return ??id;?
????????????}
???????????? set ?
????????????{?
????????????????id? = ?value;?
????????????}
????????}
???????? public ? static ? int ?Data
????????{
???????????? get
????????????{
???????????????? return ?data;
????????????}
???????????? set
????????????{
????????????????data = value;
????????????}
????????}
???????? /// ? <summary>
???????? /// ?by?index
???????? /// ? </summary>
???????? public ? string ? this ?[? int ?index?]
????????{
???????????? get
????????????{
???????????????? return ?list[index].ToString();
????????????}
???????????? set
????????????{
????????????????list[index] = value;
????????????}
????????}
???????? /// ? <summary>
???????? /// ?by?value
???????? /// ? </summary>
???????? public ? string ? this ?[? string ?values]
????????{
???????????? set
????????????{
???????????????? this [list.IndexOf(values)] = value;
????????????}
????????}
????}
動(dòng)態(tài)調(diào)用:
定義變量
???????????? int ?i;
????????????Type?t = typeof (?Employee?);
????????????
????????????Employee?e = new ?Employee( 1000 , " no?1000 " );
方法1是使用Type對(duì)象上的InvokeMember方法:
先動(dòng)態(tài)調(diào)用類Employee的實(shí)例方法ToString
InvokeMember方法的第一個(gè)參數(shù)是要調(diào)用的方法名稱
第2個(gè)參數(shù)是位枚舉,代表搜尋的方式
第四個(gè)參數(shù)是要調(diào)用的對(duì)象,要是靜態(tài)的就用null
第五個(gè)參數(shù)是要傳送給ToString的數(shù)值,由於ToString方法是無(wú)參方法,這裡我們送一個(gè)空數(shù)組new object[]{}
2 ? ????????????result = ( typeof (Employee).InvokeMember( " ToString " ,
3 ? ????????????????????????????????????????????????????BindingFlags.InvokeMethod,????
4 ? ???????????????????????????????????????????????????? null ,
5 ? ????????????????????????????????????????????????????e,????
6 ? ???????????????????????????????????????????????????? new ? object []{})).ToString();
7 ? ????????????Console.WriteLine( " instance?Method?'ToString'?result={0} " ,?result?);
8 ?
再動(dòng)態(tài)調(diào)用類Employee的實(shí)例方法add,靜態(tài)方法add
注意InvokeMember方法的第5個(gè)參數(shù)代表的是要傳送給add方法的數(shù)值
第8個(gè)參數(shù)代表的是add方法的參數(shù)名稱
????????????result = typeof (Employee).InvokeMember( " add " ,
????????????????????????????????????????????????BindingFlags.InvokeMethod,
???????????????????????????????????????????????? null ,
????????????????????????????????????????????????e,
???????????????????????????????????????????????? new ? object []{ " o1 " , " o2 " },
???????????????????????????????????????????????? null ,
???????????????????????????????????????????????? null ,
???????????????????????????????????????????????? new ? string []{ " key1 " , " key2 " }).ToString();
????????????Console.WriteLine( " instance?Method?'add'?result={0} " ,?result?);
???????????? // call?static?Method?"add"
????????????result = typeof (Employee).InvokeMember( " add " ,
????????????????????????????????????????????????BindingFlags.InvokeMethod? | ?BindingFlags.Static? | ?BindingFlags.Public?,
???????????????????????????????????????????????? null ,
???????????????????????????????????????????????? null ,
???????????????????????????????????????????????? new ? object []{ " o1 " , " o2 " , " o3 " },
???????????????????????????????????????????????? null ,
???????????????????????????????????????????????? null ,
???????????????????????????????????????????????? new ? string []{ " key1 " , " key2 " , " key3 " }).ToString();
????????????Console.WriteLine( " static?Method?'add'?result={0} " ,result?);
????????????Console.WriteLine();
再修改靜態(tài)屬性Data,把它從119修改為911
?2 ? ????????????i = ( int ) typeof (Employee).InvokeMember( " Data " ,
?3 ? ????????????????????????????????????????????????BindingFlags.GetProperty? | ?BindingFlags.Public? | ?BindingFlags.Static,
?4 ? ???????????????????????????????????????????????? null ,
?5 ? ???????????????????????????????????????????????? null ,
?6 ? ???????????????????????????????????????????????? new ? object []{});
?7 ? ????????????Console.WriteLine( " static?Property?'Data'={0} " ,?i?);
?8 ?
?9 ? ???????????? // update?static?Property
10 ? ???????????? typeof (Employee).InvokeMember( " data " ,
11 ? ????????????????????????????????????????????BindingFlags.SetField? | ?BindingFlags.NonPublic? | ?BindingFlags.Static,
12 ? ???????????????????????????????????????????? null ,
13 ? ???????????????????????????????????????????? null ,
14 ? ???????????????????????????????????????????? new ? object []{ 911 });
15 ? ????????????Console.WriteLine( " update?static?Property?


16 ?
17 ? ???????????? // call?static?Property
18 ? ????????????i = ( int ) typeof (Employee).InvokeMember( " Data " ,
19 ? ????????????????????????????????????????????????BindingFlags.GetProperty? | ?BindingFlags.Public? | ?BindingFlags.Static,
20 ? ???????????????????????????????????????????????? null ,
21 ? ???????????????????????????????????????????????? null ,
22 ? ???????????????????????????????????????????????? new ? object []{});
23 ? ????????????Console.WriteLine(? " again?call?static?Property?'Data'={0} " ,i?);
24 ? ????????????Console.WriteLine();
25 ?
再修改實(shí)例屬性Name,把它從no 1000修改為w
?2 ? ????????????result = typeof (Employee).InvokeMember( " Name " ,
?3 ? ????????????????????????????????????????????????BindingFlags.GetProperty?,
?4 ? ???????????????????????????????????????????????? null ,????
?5 ? ????????????????????????????????????????????????e,????
?6 ? ???????????????????????????????????????????????? new ? object []{}).ToString();
?7 ? ????????????Console.WriteLine(? " instance?Property?'Name'={0} " ,?result?);
?8 ?
?9 ? ???????????? // update?instance?property
10 ? ???????????? typeof (Employee).InvokeMember( " name " ,?
11 ? ????????????????????????????????????????????BindingFlags.SetField? | ?BindingFlags.NonPublic?? | ?BindingFlags.Instance????,
12 ? ???????????????????????????????????????????? null ,
13 ? ????????????????????????????????????????????e,
14 ? ???????????????????????????????????????????? new ? object []{ " w " });
15 ? ????????????Console.WriteLine( " update?instance?property?


16 ? ????????????
17 ? ???????????? // again?call?read?instance?Property
18 ? ????????????result = typeof (Employee).InvokeMember( " Name " ,
19 ? ????????????????????????????????????????????????????BindingFlags.GetProperty?,
20 ? ???????????????????????????????????????????????????? null ,????
21 ? ????????????????????????????????????????????????????e,
22 ? ???????????????????????????????????????????????????? new ? object []{}).ToString();
23 ? ????????????Console.WriteLine(? " again?call?instance?Property?'Name'={0} " ,?result?);
24 ? ????????????Console.WriteLine();
25 ?
再修改索引器,把索引器的第2個(gè)(index[1])內(nèi)容修改為222
注意修改索引器的InvokeMember方法,第5個(gè)參數(shù)的數(shù)組new object[]{"002","222"}
將要設(shè)置元素的索引值放在對(duì)象數(shù)組的第一個(gè)元素中,將要設(shè)置的值作為第二個(gè)元素
?2 ? ????????????result = typeof (Employee).InvokeMember( " Item " ,
?3 ? ????????????????????????????????????????????????????BindingFlags.GetProperty,
?4 ? ???????????????????????????????????????????????????? null ,
?5 ? ????????????????????????????????????????????????????e,
?6 ? ???????????????????????????????????????????????????? new ? object []{ 1 }).ToString()?;
?7 ? ????????????Console.WriteLine( " index[1]={0} " ,?result);
?8 ?
?9 ? ???????????? // update??index[1]?
10 ? ???????????? typeof (Employee).InvokeMember( " Item " ,
11 ? ????????????????????????????????????????????BindingFlags.SetProperty,
12 ? ???????????????????????????????????????????? null ,????
13 ? ????????????????????????????????????????????e,
14 ? ???????????????????????????????????????????? new ? object []{ " 002 " , " 222 " });
15 ? ????????????Console.WriteLine( " update??index[1]?


16 ?
17 ? ???????????? // again?call?index[1]
18 ? ????????????result = typeof (Employee).InvokeMember( " Item " ,
19 ? ????????????????????????????????????????????????BindingFlags.GetProperty,
20 ? ???????????????????????????????????????????????? null ,
21 ? ????????????????????????????????????????????????e,
22 ? ???????????????????????????????????????????????? new ? object []{ 1 }).ToString()?;
23 ?
24 ? ????????????Console.WriteLine( " again?call?index[1]={0} " ,?result);
25 ? ????????????Console.WriteLine();
26 ?
調(diào)用構(gòu)造器
InvokeMember方法的第1個(gè)參數(shù)為空字符""
2 ? ????????????Employee?employee = (Employee) typeof (Employee).InvokeMember( "" ,
3 ? ????????????????????????????????????????????????????????????????????????BindingFlags.CreateInstance,
4 ? ???????????????????????????????????????????????????????????????????????? null ,
5 ? ???????????????????????????????????????????????????????????????????????? null ,
6 ? ???????????????????????????
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
