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