反射是.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 再...