c#使用反射調(diào)用類型成員示例
在實(shí)際的工作中直接使用反射的機(jī)會(huì)比較少,有印象的就是一次自己做的WinForms小工具的時(shí)候利用反射來(lái)動(dòng)態(tài)獲取窗體上的每個(gè)控件,并且為必要的控件動(dòng)態(tài)添加注冊(cè)事件。因?yàn)閯側(cè)肼毿鹿?,為了更快的了解公司的業(yè)務(wù)、和開(kāi)發(fā)習(xí)慣,先和現(xiàn)在公司同事一起修改現(xiàn)有系統(tǒng)的一些小Bug。在Tester提交的Bug中有一個(gè)是對(duì)GridView進(jìn)行動(dòng)態(tài)的排序——點(diǎn)擊一個(gè)列時(shí)使用該列作為條件進(jìn)行排序(PS:點(diǎn)擊一個(gè)列時(shí)前臺(tái)會(huì)將該列的字符串(該字符串是)傳到后臺(tái)的方法中)。
使用反射的原因
為什么會(huì)選擇使用反射呢?在項(xiàng)目中我們使用NHibernate作為ORM框架,一般情況下在BLL層其實(shí)都提供了對(duì)應(yīng)的排序方法,但是現(xiàn)在需要修改的這個(gè)Bug使用的數(shù)據(jù)不是在一張表里面,而是一個(gè)視圖。如果按照以前排序功能實(shí)現(xiàn)模式的話,需要在多個(gè)地方進(jìn)行修改;且由于是剛接觸這個(gè)項(xiàng)目,對(duì)項(xiàng)目的結(jié)構(gòu)還不夠了解,不宜進(jìn)行大面積的修改。和同事溝通后決定使用反射來(lái)實(shí)現(xiàn)。理由如下:
因?yàn)槭侵苯訉?duì)已經(jīng)從數(shù)據(jù)庫(kù)返回的結(jié)果進(jìn)行排序,所有只需要在一個(gè)地方修改(BLL層)
雖然使用反射會(huì)增加性能上的開(kāi)銷,但是在這個(gè)場(chǎng)景數(shù)據(jù)量并不大,性能上的消耗可以忽略不計(jì)
使用反射動(dòng)態(tài)調(diào)用代碼
反射給人感覺(jué)好像很復(fù)雜,其實(shí)使用起來(lái)還是比較方便的,由于項(xiàng)目中代碼上下文牽涉過(guò)多,不適合貼出來(lái),下面是使用我自己整理的使用反射進(jìn)行動(dòng)態(tài)調(diào)用,常用的一些代碼片段:
classProgram
{
staticvoidMain(string[]args)
{
Typetype=typeof(Employee);
//使用無(wú)參構(gòu)造函數(shù)動(dòng)態(tài)創(chuàng)建對(duì)象
varobjNull=type.InvokeMember(null,BindingFlags.CreateInstance,null,null,null);
//調(diào)用兩個(gè)使用了兩個(gè)string參數(shù)的構(gòu)造函數(shù)動(dòng)態(tài)創(chuàng)建對(duì)象
varfrankJob=type.InvokeMember(null,BindingFlags.CreateInstance,null,null,newobject[]{"job","frank"});
//調(diào)用公有成員屬性get方法
varfileName=type.InvokeMember("FirstName",BindingFlags.GetProperty,null,frankJob,null);
//調(diào)用公有成員屬性set方法
type.InvokeMember("Email",BindingFlags.SetProperty,null,frankJob,newobject[]{"gyzdfasddfsafhao@vervidian.com"});
//動(dòng)態(tài)調(diào)用無(wú)參數(shù)方法
varobjStr=type.InvokeMember("ToString",BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static,null,frankJob,null);
//動(dòng)態(tài)調(diào)用帶參數(shù)的方法
varemail=type.InvokeMember("GetEmail",BindingFlags.InvokeMethod,null,frankJob,newobject[]{"sunshine"});
}
publicclassEmployee
{
publicintId{get;set;}
publicstringFirstName{get;set;}
publicstringLastName{get;set;}
publicstringAddress{get;set;}
publicstringEmail{get;set;}
publicEmployee(){}
publicEmployee(stringfirstName,stringlastName)
{
FirstName=firstName;
LastName=lastName;
}
publicoverridestringToString()
{
returnstring.Format("{0}{1}",LastName,FirstName);
}
publicstringGetEmail(stringuser)
{
returnstring.Format("{0}@gmail.com",user);
}
}
}
相關(guān)文章
c#數(shù)據(jù)綁定之將datatabel的data添加listView
這篇文章主要介紹了c#將DataTabel的data添加ListView的示例,實(shí)現(xiàn)功能是通過(guò)響應(yīng)UI Textbox 的值向ListView 綁定新添加的紀(jì)錄。 ,需要的朋友可以參考下2014-04-04C#使用checkedListBox1控件鏈接數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了C#使用checkedListBox1控件鏈接數(shù)據(jù)庫(kù)的方法,結(jié)合具體實(shí)例形式分析了數(shù)據(jù)庫(kù)的創(chuàng)建及checkedListBox1控件連接數(shù)據(jù)庫(kù)的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06C#微信開(kāi)發(fā)之啟用開(kāi)發(fā)者模式
本文主要介紹了C#微信開(kāi)發(fā)中啟用開(kāi)發(fā)者模式的步驟與方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02淺談Visual C#進(jìn)行圖像處理(讀取、保存以及對(duì)像素的訪問(wèn))
本文主要介紹利用C#對(duì)圖像進(jìn)行讀取、保存以及對(duì)像素的訪問(wèn)等操作,介紹的比較簡(jiǎn)單,希望對(duì)初學(xué)者有所幫助。2016-04-04C#調(diào)用Windows的API實(shí)現(xiàn)窗體動(dòng)畫
在VF、VB、PB的應(yīng)用中,有些無(wú)法通過(guò)語(yǔ)言工具本身來(lái)完成的或者做得不理想的功能,我們會(huì)考慮通過(guò)Windows的API來(lái)完成。本文就來(lái)通過(guò)調(diào)用Windows的API實(shí)現(xiàn)窗體動(dòng)畫,感興趣的可以嘗試一下2022-11-11C#使用UdpClient類進(jìn)行簡(jiǎn)單通信的實(shí)例
本文主要介紹了C#使用UdpClient類進(jìn)行簡(jiǎn)單通信的實(shí)例,具有很好的參考價(jià)值,需要的朋友可以看下2016-12-12