反射傳送實戰( )InvokeMember

2021-08-21 22:59:34 字數 3021 閱讀 6587

反射是.net中的高階功能之一,利用反射可以實現許多以前看來匪夷所思的功能,下面是我看了《programming c#

》(o'reilly)之後對於反射的一點實踐,本想直接做個應用程式來說明問題,但苦於工作繁忙並考慮到以簡單為主,故先對反射傳送(reflection emit)的使用做一些介紹。文章最後再給出乙個例項。

下面的程式在執行時生成了乙個test.cs檔案,並呼叫csc編譯成test.dll檔案,然後利用type.invokemember()方法呼叫其中的sayhello()方法,然後和原始方法對比一下效能。

using

system;

using

system.diagnostics;

using

system.io;

using

system.reflection;

namespace

invokemember

timespan elasped

=datetime.now

-starttime;

console.writeline(

"looping elapsed milliseconds:"+

elasped.totalmilliseconds +"

for iterations

",iterations);

//使用反射傳送

reflectiontest t

=new

reflectiontest();

//計算所用時間

starttime

=datetime.now;

for(

inti =0

;i <

iterations;i++)

elasped

=datetime.now

-starttime;

console.writeline(

"looping elapsed milliseconds:"+

elasped.totalmilliseconds +"

for iterations

",iterations);

console.readline();}}

//////

reflection 的摘要說明。

///public

class

reflectiontest

//呼叫方法時的引數陣列(此處為空)

object

arguments

=new

object[0

];//

呼叫動態生成類的方法

thetype.invokemember(

"sayhello",

//要呼叫的方法名

bindingflags.default

|bindingflags.invokemethod,

//binding標誌,具體參看msdn

null,//

使用預設binding物件

theclass,

//在theclass例項上呼叫此方法

arguments

//呼叫方法時的引數陣列);}

//////

執行時生成**

///private

void

generatecode()

",classname);

wrtr.writeline(""

);wrtr.writeline("}

");//關閉streamwriter和檔案

wrtr.close();

s.close();

//啟動程序編譯原始檔

//指定引數

processstartinfo psi

=new

processstartinfo();

//啟動cmd.exe

psi.filename ="

cmd.exe";

的引數,/c-close,完成後關閉;後為引數,指定cmd.exe使用csc來編譯剛才生成的原始檔

string

compilestring ="

/c c:\\winnt\\microsoft.net\\framework\\v1.1.4322\\csc.exe /optimize+ /target:library .cs";

psi.arguments

=string.format(compilestring,filename);

//執行時的風格-最小化

psi.windowstyle

=processwindowstyle.minimized;

//啟動程序

process proc

=process.start(psi);

//指定當前在此程序退出前等待

proc.waitforexit();

//從編譯好的dll檔案load乙個assembly

assembly a

=assembly.loadfrom(filename +"

.dll");

//建立類的例項

theclass

=a.createinstance(classname);

//取得此類例項的型別

thetype

=a.gettype(classname);

//刪除原始檔

+ ".cs");}}

}程式執行結果:

hello,world

hello,world..

.looping elapsed milliseconds:93.75 for 100 iterations

hello,world

hello,world..

.looping elapsed milliseconds:2875 for 100 iterations

效能上不佔優勢,主要是因為要進行寫檔案和編譯的工作,但是後面的方法會對效能進行優化,到最後乙個方法時效能會有大幅提高,但是最後一種方法的實用性不如前兩種。

java反射機制實戰 4 Field

有了上一節method的實驗,操作field就易如反掌了。反射父類物件 public class abstractreflectionmodel public string getid public void setid string id public string getid2 public v...

《Unity開發實戰》 3 2節建立反射材質

3.2 建立反射材質 金屬 車漆,以及光滑的塑料表面都是一些很常見的需要反射的材質的例子。幸運的是,unity內建了反射著色器 reflective shader 配置好以後就可以幫我們實現想要的效果了。3.2.1 準備工作 本節需要準備兩個紋理貼圖 base map 底圖 和reflection ...

C 實戰反射 事件 抽象工廠 發布訂閱模式

最近一直在做乙個新系統,其中小部分任務需要用到事件監聽觸發的過程。自己先練練手。首先是,listener的 監聽者監聽到事件後需要作出的反應。public void reportwork eventdata data public void finalinspect eventdata data 再...