//*********創(chuàng)建實(shí)例***********
Type t = typeof(ClassTest);//表示類型聲明:類類型、接口類型、數(shù)組類型、值類型、枚舉類型、類型參數(shù)...。
object obj = Activator.CreateInstance(t);//通過反射創(chuàng)建對(duì)象實(shí)例,如果是靜態(tài)類則不須實(shí)例化
//obj = ass.CreateInstance("ReflectionTest.ClassTest"); //類的全限定名.命名空間.類名
//*********創(chuàng)建和調(diào)用方法***********
MethodInfo method = t.GetMethod("WriteString"); //搜索具有指定名稱的公共方法。
String s = (String)method.Invoke(obj, new Object[] { "123" });//反射類的對(duì)象實(shí)例,方法參數(shù)
//靜態(tài)方法
method = type.GetMethod("StaticWriteString");
method.Invoke(null, new string[] { "test" }); //如果是靜態(tài)方法,第1個(gè)參數(shù)則忽略,設(shè)為null
//無參的靜態(tài)方法
method = type.GetMethod("NoneParaWriteString");
method.Invoke(null, null);//無參則第2個(gè)參數(shù)設(shè)為null.
System.Diagnostics.Trace.WriteLine(s);//輸出到"調(diào)試--窗口--即時(shí)窗口"
C#反射學(xué)習(xí)時(shí)幾點(diǎn)注意內(nèi)容:
1.指定類庫文件必須使用絕對(duì)路徑,不能使用相對(duì)路徑(其實(shí)感覺有點(diǎn)不合理,不太方便)
3.第5行如果反射的類使用的是靜態(tài)方法,則第1個(gè)參數(shù)須調(diào)為null。
4.由于這個(gè)方法有兩個(gè)參數(shù),可以用這種Object的方法指定參數(shù)也可以直接寫method.Invoke(obj, new Object[] { "test", 1 });
5.調(diào)用的方法是一個(gè)靜態(tài)方法,這時(shí)候Invoke的時(shí)候,對(duì)于第一個(gè)參數(shù)是無視的,也就是我們寫什么都不會(huì)被調(diào)用,即使我們隨便new了一個(gè)any這樣的Object,當(dāng)然這種寫法是不推薦的。但是對(duì)應(yīng)在例子1種我們?nèi)绻鸌nvoke的時(shí)候用了類型不一致的實(shí)例來做為參數(shù)的話,將會(huì)導(dǎo)致一個(gè)運(yùn)行時(shí)的錯(cuò)誤。
6.第三個(gè)例子是一個(gè)調(diào)用無參數(shù)靜態(tài)方法的例子,這時(shí)候兩個(gè)參數(shù)我們都不需要指定,用null就可以了。
再說一個(gè)問題,如果調(diào)用的類是靜態(tài)類的時(shí)候,需要注意一個(gè)問題,肯定我們會(huì)想到一個(gè)問題,靜態(tài)類是不能實(shí)例化的,這時(shí)候,31行的類的實(shí)例化的方法我們就不需要了,直接使用Invoke就可以實(shí)現(xiàn),否則將會(huì)出現(xiàn)運(yùn)行時(shí)的錯(cuò)誤,同樣的道理,第一個(gè)參數(shù)將會(huì)被無視,只要我們傳對(duì)了參數(shù)就可以了。