一個最簡單的C#反射實例,首先編寫類庫如下:
namespace ReflectionTest { public class WriteTest { //帶參數的公共方法 public void WriteString(string s, int i) { Console.WriteLine("WriteString:" + s + i.ToString()); } //帶一個參數的靜態方法 public static void StaticWriteString(string s) { Console.WriteLine("StaticWriteString:" + s); } //不帶參數的靜態方法 public static void NoneParaWriteString() { Console.WriteLine("NoParaWriteString"); } } }
控制台程序項目如下:
class TestApp { public static void Main() { Assembly ass; Type type; Object obj; //用來測試靜態方法 Object any = new Object(); //指定類庫文件必須使用絕對路徑,不能使用相對路徑 ass = Assembly.LoadFile(@"D:\Source Code\00.C#Sudy\01.Reflection\01\ReflectTest.dll"); //命名空間和類的名字必須一起指定 type = ass.GetType("ReflectionTest.WriteTest"); /**//*example1---------*/ MethodInfo method = type.GetMethod("WriteString"); string test = "test"; int i = 1; Object[] parametors = new Object[]{test,i}; //在例子1種必須實例化反射要反射的類,因為要使用的方法並不是靜態方法。 //創建對象實例 obj = ass.CreateInstance("ReflectionTest.WriteTest"); //執行帶參數的公共方法 method.Invoke(obj, parametors); //method.Invoke(any, parametors);//異常:必須實例化反射要反射的類,因為要使用的方法並不是靜態方法。 /**//*example2----------*/ method = type.GetMethod("StaticWriteString"); method.Invoke(null, new string[] { "test"}); //第一個參數忽略//對於第一個參數是無視的,也就是我們寫什么都不會被調用, //即使我們隨便new了一個any這樣的Object,當然這種寫法是不推薦的。 //但是對應在例子1種我們如果Invoke的時候用了類型不一致的實例來做為參數的話,將會導致一個運行時的錯誤。 method.Invoke(obj, new string[] { "test"}); method.Invoke(any, new string[] { "test"}); /**//*example3-----------*/ method = type.GetMethod("NoneParaWriteString"); //調用無參數靜態方法的例子,這時候兩個參數我們都不需要指定,用null就可以了。method.Invoke(null, null); } }