反射有個典型的應用,就是菜單的動態加載,原理就是經過反射調用某個窗體(類)。下面演示一下經過反射調用類及方法:spa
一、新建一個類,命名爲:ReflectionHelper,代碼以下:code
#region 建立對象實例 /// <summary> /// 建立對象實例 /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param name="assemblyName">程序集名稱</param> /// <param name="nameSpace">命名空間</param> /// <param name="className">類名</param> /// <returns></returns> public static T CreateInstance<T>(string assemblyName, string nameSpace, string className) { try { //命名空間.類名,程序集 string path = nameSpace + "." + className + "," + assemblyName; //加載類型 Type type = Type.GetType(path); //根據類型建立實例 object obj = Activator.CreateInstance(type, true); //類型轉換並返回 return (T)obj; } catch { //發生異常時,返回類型的默認值。 return default(T); } } #endregion #region 調用方法實例 /// <summary> /// 調用方法實例 /// </summary> /// <typeparam name="T">對象類型</typeparam> /// <param name="assemblyName">程序集名稱</param> /// <param name="nameSpace">命名空間</param> /// <param name="className">類名</param> /// <returns></returns> public static T GetInvokeMethod<T>(string assemblyName, string nameSpace, string className, string methodName, object[] paras) { try { //命名空間.類名,程序集 string path = nameSpace + "." + className + "," + assemblyName; //加載類型 Type type = Type.GetType(path); //根據類型建立實例 object obj = Activator.CreateInstance(type, true); //加載方法參數類型及方法 MethodInfo method = null; if (paras != null && paras.Length > 0) { //加載方法參數類型 Type[] paratypes = new Type[paras.Length]; for (int i = 0; i < paras.Length; i++) { paratypes[i] = paras[i].GetType(); } //加載有參方法 method = type.GetMethod(methodName, paratypes); } else { //加載無參方法 method = type.GetMethod(methodName); } //類型轉換並返回 return (T)method.Invoke(obj, paras); } catch { //發生異常時,返回類型的默認值。 return default(T); } } #endregion
二、新建一個WinForm窗體,命名爲Main,添加兩個按鈕。orm
三、新建一個WinForm窗體,命名爲Form2。對象
四、Form2窗體的代碼以下:blog
public string SayHello() { return "Hello World."; }
五、Main窗體的代碼以下:string
/// <summary> /// 調用窗體2 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { Form form2 = ReflectionHelper.CreateInstance<Form>("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2"); form2.ShowDialog(); } /// <summary> /// 調用窗體2的SayHello方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { string result = ReflectionHelper.GetInvokeMethod<String>("LinkTo.Test.WinForm", "LinkTo.Test.WinForm.Reflection", "Form2", "SayHello", null); MessageBox.Show(result, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); }